1. 注重代码实现 vs 注重解决方案
初级开发者更倾向于专注于实现一个新的特性, 他们自然而然的更关注应用编程知识去完成代码实现。这种想法与做法是造成初级开发者缺乏大局观的主要原因。要知道代码实现只是完成解决方案的一种手段,并不是解决方案本身。
而高级开发者更偏向于研究系统的整体架构,他们不仅仅只关注一个特性,而是思考这个新特性对整体系统的影响,包括这个新特性是否满足系统整体的需求以及对系统复杂性有何改变。他们会估测为完成新特性要付出的代价,并且如果对于系统整体来讲不妥当的话会毫不犹豫的提出反对意见。
并且实际上通常来讲对于所需的解决方案总会有不同的实现方式。
#小贴士
要引进新特性的时候应该思考一些问题,比如对于业务的影响,时间线,优先度等等。这种思考方式会帮助你更加专注于那些有明确需求的工作。相信我,拒绝一些需求也是可行的选项,并且可能会帮你实现更多成果。

2. 做出推测 vs 收集证据
初级开发者倾向于对不确定的事做出假设,然后常常会忘记证实这些假设。造成这种现象有很多原因,包括缺乏自信,不知道询问谁,或者仅仅是不想被听起来很蠢。有的时候这种假设会看起来微不足道,比如忽略一个测试用例并假设他永远不会真实发生,往往随着代码库变庞大,这种小问题会逐渐变成大问题并且难以查错纠错。
“The single biggest problem in communication is the illusion that it has taken place.” — George Bernard Shaw
高级开发者则更加稳妥和自信。他们有自己的经验法则——“有疑惑的时候就去问问题“。对于他们来讲收集证据非常重要,他们可以很好的和团队成员交流,有必要的时候也会与外部成员交流,并且只会在完全搞清楚需要做什么之后才继续推进。
#小贴士
思考问题和解决方案的时候追求更加明确和翔实的答案会帮助你从一开始就避免一些小 bug 和小问题。

3. 纠结于技术栈 vs 忠于基础知识
初级开发者缺乏经验,很多都是刚刚开始全职工作。通常来讲初级开发者的思维方式是学的越快越好。他们通常会开始研究代码库然后去学习一些工具和框架。他们可能会用 Spring MVC 去实现一个服务,但是脱离了 Spring 框架就不会实现了。
高级开发者却已经经历过那个阶段,他们明白框架是有用的但是也是有有效期的。很快就会有新的框架然后大家又开始转移到新的框架。所以高级开发者们更加专注于系统需求,如何设计一个系统架构,然后去决定最合适的工具和框架。
#小贴士
技术和框架来来往往,多到难以置信。但是这些技术和框架都是基于一些核心思想去构建的。如果你熟知这些基础核心思想,你就可以在不同的框架,语言和工具中快速切换,来去自如。举一个关系型数据库的例子,有很多关系型数据库,但是如果你理解了背后的思想,比如 ACID,index,transaction 和 concurrency,你就不用担心有多少可用的数据库。

4. 把自己关小黑屋 vs 与别人协作
很多开发者喜欢戴着他们的耳机自己一个人工作,这样可以帮助他们更加专注。对于他们来讲与计算机交流比与人交流更加简单。但是写代码不仅仅是与计算机交流,也是与人类交流。你写的代码也要让今后参与开发的人看懂。这点也是一个区分高级开发者和初级开发者的方式。
高级开发者更加了解如何协作。他们知道什么时候该切断外界交流专注于工作和什么时候去与别人协作。这种协作可以是指导初级开发者,结对去解决一些问题,向他们解释一些最佳实践,检查他们的代码等等。另外,他们也会与项目经理交流项目计划,思考技术负债以及制定任务优先级。他们知道应该如何平衡协作与独立工作。
#小贴士
敞开心扉,从别人身上多学习。你可以从他们的经验当中收益,你可以继承他们的智慧和知识。我们周围的人会对我们的行为方式,态度和成果产生最大的影响。这也是为什么在找工作中不仅要看职位和薪水,更加要看与你一同工作的周围的人是什么水平。

5. 着急完成任务 vs 懂得获取知识
当我刚刚开始做软件工程师的时候,也难以避免坐上“赶快完成任务“的新干线。我总是赶快找到可以帮助我快速推动项目开发的方案,当时我觉得如果我赶快完成任务,我就可以对项目产生更大的影响,并且可以快速推动职业发展。
但是!
并不是这样的。
很幸运我很快意识到这是不对的,并且赶快切换到了“获取知识“的绿皮车,伙计,这车很厉害。我能够享受我的工作,对于不同的工具和框架我可以做出更好的决策,我收获了很多基本概念及知识,比如关于编程,关于面向对象模式,函数编程,数据库(SQL 和 NoSQL),微服务以及可拓展性等等。我能够学习更多的编程语言并且不用把太多时间投入官方教程。我不是想炫耀,但是我懂 Java,Kotlin,Python,一些 Go 语言 还有一些 Scala。
相信这也是初级开发者和高级开发者的区别之一。
#小贴士
多花些时间去专注于学习,不要害怕多用一点时间完成任务,记住抓住机会尽可能实现收益最大化。试着投入时间去深入理解你所使用的不同库和框架的内部核心。

6. 专注于速度 vs 专注于质量
与第五点相似,这一点更多的是关于完成任务。从期待值的角度来看,你的工作就是完成任务,但是初级开发者往往不能很好的关注解决方案的质量。他们觉得这并没有用并且会拖慢开发进度。他们不能够意识到代码质量和测试的重要性。
软件工程师的任务不仅仅是完成功能,也要让代码有良好的可读性和可维护性。高级开发者更加擅长于此。他们更加熟练于编写高质量的代码,遵循一些设计模式,他们会写测试,制定端对端测试的计划,引进合同测试,制定设计文档等等。对于他们来讲完成一个任务是多角度的。并且当这样做成为一种习惯的话,自然而然你就可以提高完成任务的速度并且不需要对质量做出妥协。
#小贴士
让质量去驱动你的决策。刚开始会很难,因为它需要付出更多的时间和努力。但是它会逐渐变容易然后成为你新的日常工作方式。
“I’m not a great programmer; I’m just a good programmer with great habits.“―Kent Beck

结论
不仅仅是经验年数可以区分一个初级开发者和高级开发者,很多方面都要多加注意。对于上面讨论过的几点,如果你能在今后的工作中多加关注与实践,它定会帮助你提升自己并且驱动你做好到达职业下一个阶段的准备。