通常来讲,程序员在工作中遇到的挑战分为下面几类:
1. 技术能力的掌握:这是入门手艺,得掌握了这门技术,才能干这个活。其中包括基础的部分和高级的部分。
基础的部分比如使用语言的语法、面向对象的基本原则的掌握和应用、设计模式的掌握和应用。这部分虽然基础,但是却是普通程序员和优秀程序员的重要区别。一个优雅的代码,不需要多么高深的技能,其实践行面向对象开发的一些原则,比如封装性、单一职责、开闭原则、高内聚低耦合原则等,就可以实现很优雅的代码。重要的是“知行合一”。原则都知道,要运用在工作中,就需要比较多的思考和实践。
稍微高级点的,涉及到高并发、超大数据量的管理和使用,引入redis、kafka、分布式架构等。这部分能力的积累和提升,如果可以学用一体会更好。要加深自己的深度、学习底层原理的话,就要多看一些博客、文章、书籍了。在面试中,这也是考察的重要一方面。不仅仅要知道怎么用kafka,还可以理解kafka如何保证消息不丢失、如何实现高可用。不仅仅知道redis存取速度快,支持原子操作,还要知道为什么存取快、如何避免雪崩、击穿、穿透等。
算法这块,在面试中是很重要的,是考察一个人的逻辑思维能力、严谨性、代码书写能力的重要手段。可以通过在leecode刷题、看一些算法书籍比如《算法》《算法导论》等来提升自己。
这部分的挑战,也是在程序
2. 业务逻辑的理解:技术是为解决实际问题而存在。
所以面对各种复杂系统,可以比较好的梳理其中的关系,并实现落地是很重要的。程序,其实是实现特定业务目的的工具。比如是要更好的管理物流系统,还是可以把商品卖出去,还是可以可以进行转账汇款。所以程序员遇到的挑战是和要实现的业务场景分不开的。
初级程序员和高级程序员的一个重要区别就是是否可以快速理清复杂的业务逻辑,形成文档、脑图,并产出匹配的设计、架构、实现方案。这既要掌握比较扎实的技术知识,有合适的选型。更要有严谨的思维能力、强大的业务梳理能力,把复杂的业务场景抽象为程序层面的代码设计。
随着工作年龄的增长,对特定场景的业务逻辑的掌握,很可能成为你的核心竞争优势。
3. 沟通、协调:工作中除了写代码以外,其实还有大量的时间需要和团队其他成员沟通、协作。
比如和产品沟通需求内容、和QA沟通实现方式、和前端/后端 沟通交互方案、和兄弟部门沟通职责划分、协作方案等等。可不能小看了这个沟通的工作,很多时候这个甚至是占据工作主要时间的事情。有时候会比较讽刺的遇到“白天开会,晚上写代码”的情况。
所以如何高效沟通,实现无遗漏、不误解,并最终落成沟通既要发布出来,都是对一个人的重要挑战,也是走向资深程序员的必经之路。
很多人卡在资深程序员的前面,就是因为沟通、理解能力不足。虽然有很好的技术,但是在某种程度上,尤其是做业务研发的团队,沟通、理解能力的重要性远远大于技术能力。这并非危言耸听。
最后,我总结下:程序员在工作中遇到的挑战,其实是和程序员的三方面能力增长路径相匹配的,技术、业务、沟通。程序员是一个脑力劳动者,工作中对主观能动性的要求很高。如果自己不思考如何精进自己,如何在这三方面提升自己,靠着被分配工作、让做什么就做什么来混日子,是很难有大的长进的。
期望你可以知行合一,可以做到基础知识扎实、项目梳理能力突出、沟通协作能力优秀的程序员。