用心做点事,写点代码的哲学(编程的基本功)

回调是编程层面的设计模式。回调函数使得程序设计更加灵活。实现模块独立性,将实现者和调用者分离,符合面对对象高内聚低耦合的设计思想。

  算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。
  给年轻的App开发建议就是要注重基础.《第一行代码》 《Android群英传》 《Android开发艺术探索》
  作为Android开发多看看底层的源码,Java的基础,设计模式和算法以及iOS的基本知识。
  更重要的是在学习的过程中找到适合自己的学习方法,比如我就是多看书,然后敲一敲自己喜欢的代码,写博客总结归纳。关于书,我建议大家还是多多宜善,不仅仅限于专业的。


> 学习方法:大的流程就是: 问题发现->提炼总结->在知识树上找位置->补充基础知识->自己尝试解决问题->研究行业已有解决方案。
这比简单的 “问题发现->研究行业已有解决方案” 的路子要学习效果更好。
  CS专业的基本功(数据结构,操作系统,网络,组成原理),尽可能的拓展自己的视野,对所有技术心怀学习的热情和好奇心:不能因为是写代码的,就忽略对硬件的学习;不能因为是写前端的,就减少对算法的了解;不能因为是写 C/C++ 的,就鄙视写 PHP 的;不能因为是做数据、算法研究的,就放弃对工程技术的专研。
  在一个非常难的问题面前的思考过程,比如对问题进行分析,拆分,总结问题,思考思路,在确定思路前提出验证方法这样。
  从项目类型上,经历过 Windows 客户端开发、网站前后台开发、系统运维、游戏、安全、操作系统、搜索引擎、自然语言处理、分布式存储和数据库、P2P、CDN 网络加速、模式识别、数据分析和挖掘这些方面的技术项目,这也基本反应了在技术方面的成长。
  对基础和细节的重视不够或者急于求成等原因,导致在实际的开发中总是或多或少遇到各种无法解释的现象,比如写 C/C++ 的工程师,很少有对 C 和 C++ 区分对待的能力,对他们各自的标准规范更是不了解,最后的表现就是代码出现各种诡异的问题。
  知乎上有个讨论最难调试的 bug 的讨论,其实很多都是由于对基础环境、条件的不了解,错误的做出了假设导致,如果完全熟悉整个体系的每一个环节,就会大大减少诡异 bug 的存在。


技术类开源项目和一般的业务型项目不同,更需要对代码和质量的控制,我们总结出以下几点:

> 用心写代码,用代码讲故事。代码是项目的唯一核心和产出,任何一行的代码都需要用心思考优雅性,可读性,合理性。

> 代码整洁干净到极致。简单点说就是重度代码洁癖患者。只有代码漂亮整洁,其他开源爱好者才愿意阅读代码,进而找出项目中的bug和贡献高质量代码。

> 极简代码, 高度复用,无重复代码和配置。Java生态圈的特点是高质量的开源产品极多。我们尽量考虑复用轮子,比如项目中大量用到lombok简化代码;但也不会无原则的使用开源产品,我们倾向于把开源产品分为积木类和大厦类。项目中一般只考虑使用积木类搭建属于我们自己的大厦,而不会直接用其他已成型的大厦。

> 单一需求可不考虑扩展性;两个类似需求时再提炼。

> 模块抽象划分合理。

> 如无特殊理由, 测试需全覆盖。elastic-job核心模块的测试覆盖率是95%以上。虽然单元测试覆盖率在分布式的复杂环境中并无太大说服力,但至少证明项目中很少出现低级逻辑错误。

> 对质量的定义。代码可读性 > 代码可测性 > 模块解耦设计 > 功能正确性 > 性能 > 功能可扩展性。只有代码可读,可测试,可100%掌控,项目才可持续发展。功能有缺陷可以修复,性能不够可以优化,而代码不清晰则项目会渐渐变为黑盒。所以对于框架类产品,我们认为质量 > 时间 > 成本。

> 文档清晰。


  计算机科学有两类根本问题。一类是理论:算法,数据结构,复杂度,机器学习,模式识别,等等等。一类是系统:操作系统,网络系统,分布式系统,存储系统,游戏引擎,等.
  理论走的是深度,是在追问在给定的计算能力约束下如何把一个问题解决得更快更好。而系统走的是广度,是在追问对于一个现实的需求如何在众多的技术中设计出最多快好省的技术组合。
  系统可以做到完美。要快,要安全,高并发,易扩展,效率高,容易读,高内聚,低耦合...

编程能力体现在两点:
  1.对可预测系统的理解:理解越深,预测能力越强,自己的智慧才越好发挥。这就是为什么学习软件编程最快的方式之一是“造轮子” -- 造轮子就是为了深刻理解轮子、预测轮子的行为
  2.如何把自己的目标转化成指挥方案,这其实就是“做应用题”的能力,我们从小学就在练习这个能力。现实世界的应用题可不会告诉你用什么知识点去建模,也不会透露全部必要条件,因此增强这个能力需要深刻理解现实世界的运作方式。在软件行业,这被称作“理解垂直行业的业务逻辑”

.有【造轮子的能力】和【不造轮子的觉悟】。
  编程能力是一种解决问题的能力。编程能力是一种运用机器解决问题的能力。编程能力是一种抽象问题的能力。编程能力是一种需要考虑扩展性的能力。编程能力是一种取舍的能力。编程能力是一种预见未来的能力。编程能力是一种工程能力。
  真正的编程能力其实并不是对语法细节的理解,也不在于手写或者复制粘贴,更不在于对什么操作系统的使用,或者常用库的api的记忆。而是找出解决方法的能力,把现实问题转换为代码逻辑的能力。
  只会在造轮子的时候去研究一个轮子。而不是深入研究某个轮子,我会得到造某种轮子的方法。我只会在创造一些有意思的东西的时候,才会深入某个领域去学习。而不是为了深入某个领域,再去学习这个领域的知识 。。
  每个人都可以用不同的方式成长,知道自己的喜欢的然后去计划!

你可能感兴趣的:(个人随笔)