程序员职业发展

从新人到L1 从新人到L1更多是技术能力上的考验,证明你能够把本职工作做好,这个时候需要的更多是硬实力:编程的能力、简单的设计能力。能够把一个定义好的问题妥善地解决,就达到了L1的要求。这个阶段下更多专注于技术解决方案,遇到一个问题,怎么样分解成可以编程解决的问题,在规定的项目期限内完成代码和测试工作,并部署到生产环境里。只要能够证明自己拥有这些能力,就达到了L1的标准。 上面更多是从全局的角度讨论一个L1应该具有哪些能力。 如果拆分开来,技术能力里包含了很多细小而具体的能力,这里试着列举几个: 能够熟练地使用项目需要的编程语言。 学习并掌握公司内部工具的使用,比如内部的测试框架、内部的部署流程等等。 同时这里也有很多隐含的非技术能力,同样也试着列举几个: 准确清晰地说清楚你在做什么,做了什么。 了解提问的智慧。 而加入一个新公司或者初入职场的时候,也有很多重要的事情要做,试着列举一些: 了解组里的概况,首先是本组的职责以及边界,具体拥有和维护哪些代码。 组里目前最重要的项目是什么,每个组员都在从事什么项目。 组里本年度的计划是怎样的,未来的路线图是怎么样的。 同事们性格如何,老板性格如何。 熟悉组里的代码。 熟悉公司的内部工具和Workflow,比如代码的管理 -> 代码的测试流程 -> 代码的审阅 -> 代码的合并和部署的流程。 从L1到L2 从L1到L2相对比较容易,大部分时候工作几年就会自然晋升到这个阶段。而比起上一个阶段,这个阶段的要求也只是稍微提高了一些。 技术上,要能够从独立完成一个定义好的问题 -> 能够自己解决一个中等规模的问题,这类问题往往复杂一些,但这种复杂更多是实现的复杂,而非问题的复杂。问题相对来说还是比较清楚的。在接到这样一个问题的时候,思考如何提出一个解决方案,写出一份技术设计文档,然后实现它。这样的问题通常不会涉及到太多的系统,也不会涉及到太多外部的组。可以看到比起L1来说,了解如何设计一些简单的系统,并且能够把这个设计付诸实践,就是最大的变化。这也是了解[[系统设计]]的开始,这是一条漫漫长路,这个阶段对此要求不高。 从非技术的角度来说,这个阶段沟通的重要性就开始体现了。理清问题,和PM沟通,和其他组沟通,和组里其他同事讨论设计等等,这些都需要沟通。当你完成了代码,你也需要通过沟通,来让其他人了解你的成果1。 另一个重要的能力就是写文档。清楚地描述问题和清楚地解释方案都是非常重要的技能。 从L2到L3 从L2 -> L3是一个非常大的分水岭,大部分公司里都把L3叫做Senior Software Engineer,很多公司会把L3作为terminal level,意即这可能是大部分人职业的终点,公司不再对员工有升职的要求,常年呆在这个级别也不会被开除。不同公司的要求对此可能不同,你不一定需要做到这里说到的所有要求,但是你迟早应该朝着这个方向前进。 第一点是心态上的转变,要从Independent -> Self Guide。意即不要止步于服从命令,而是开始自己思考,形成自己的判断和观点。这些判断和观点很多是从经验而来的,经验需要慢慢积累,需要多经历。但是这个心态和态度的改变可以从这个时候开始。 具体来说,L2的时候你可能更多是按照其他人的需求或者已经设计好的要求做事,比如PM说我们需要实现XX功能,其他人写好了设计文档,让你按照要求进行实现。L3的时候你应该开始问自己,为什么这么设计,这么设计好吗,有没有别的实现。XX功能能够实现,但是这些实现是为了短期还是长期?这背后真正想要解决的问题是什么,有没有可能这个功能其实并不是能解决的问题的办法。你和PM应该是平等合作的关系,你应该提供Engineer的视角的建议、策略、想法2。 进一步地,你应该开始从全局思考问题,有没有可能做得更好,当前的需求有没有可以优化的,当前的日常工作有没有可以提高的。从长远来看,这个功能真的是我们想要的吗,它可以在更长的时间范围内有效吗,如果从更长的时间考虑这个问题,我应该怎么设计。 一个完整的软件开发流程可能包含下面这些步骤。发现问题 -> 找到问题的实质 -> 找到需求 -> 确认需求 -> 协调并领导会议 -> 进行设计 -> 追踪进度 -> 实现功能 -> 测试 -> 上线 -> 后续追踪,级别越高,需要参与的环节越多,实现功能只是其中一个环节,可能反而是花时间精力最少的环节。 因为很多时候你需要给不了解情况的人解释,听众可能是有技术背景的人,也有可能是没有技术背景的人,弄清楚受众是非常重要的。这直接决定了你应该采取什么样的方式解释问题,是技术细节还是全局地解释。 ↩︎ 都行、随便、无所谓,这样的没有态度/观点/偏好其实是不受欢迎的,哪怕这是你真实的想法,你也应该解释背后的理由和动机。 ↩︎

February 25, 2023 · 飞羽醉月

决策的困境

决策的困境 困境 人的一生实在太过短暂,但是我们遇到的问题、需要做出的决策却浩若繁星。尤其是现代社会,每个人的自主权都得到了增加,我们选择的余地也更大了,从而导致遇到的决策问题更是成几何级数迅速增加。每个人都想要找出最优决策,但是很多决策实在太过复杂,我们注定不能找到一条万全的路。 复杂情况下确实不会有确定的最优解,只能说有较好的选择,但是如果以不能找到确定的最优解为由就去随便乱选,我觉得也是不稳妥的。所以请注意下面的观点都是基于如何做出尽可能好的决策来讨论的。 尽管我们面临了无数的决策,却有很多人根本没意识到自己决策的重要性。很少有人会有意识地复盘过自己做的决策,如果他们这么做了,他们可能会忽然发现原来自己此刻的状态,很大程度上就是当初决策的结果。 一个非常典型的例子就是高考。高考结束后很多人面临两个重要决策,一个是去哪读书,一个是读什么专业。相当一部分人“轻易”地做出了这两个决策。这里说“轻易”并不是说就好像抛硬币似的那么轻易,尽管确实也有这样的人。而是说,相比起这件事的重要程度来说,很多人并没有足够努力地去提高这些决策的准确性。 他们只是根据自己知道的一点有限的信息,根据父母有限的见解,根据以前听说的各种传闻,做出了这个与未来人生关系甚大的决策。“谁谁谁家孩子现在读XX专业,毕业了工作不愁”,“报纸上说了,XXX学校好,是985呢”…这种话就构成了很多人做出重大决定的全部基础。 而最可怕的一点大概是,很多时候这些重大决策给你的感觉就好像只是决定今天早上吃什么一样轻飘飘的,你根本意识不到它所产生的蝴蝶效应有多么可怕。这一点和时代变革一样,真正的时代变革并不是“忽如一夜春风来,千树万树梨花开”。而是“随风潜入夜,润物细无声”。 想要做出决策,我们能依赖的就只有理性和经验,同时,在这个过程中,还有一样与这两者并列的要素,就是信息。掌握越多与决策有关的信息,做出决策就越容易,也越精确。归结起来,想要做出高质量的决策,要么提高自己的理性思维能力(比如逻辑推理,批判性思维能力等等),或者尽可能地掌握更多经验,要么就是掌握更多的信息。 如何提高经验决策能力 Coursera上有一门很受欢迎的历史类公开课《秦始皇》,讲者是台湾大学历史系的助教吕世浩老师,吕老师在这门课开篇的时候探讨了一个重要的问题:读历史有什么用?历史在今天这样一个前所未有的时代里能够为我们提供怎样的价值?吕老师的观点非常有意思,各位可以花时间去看看这节课,我在这里就不啰嗦了。我想说的则是吕老师在如何读历史里引用的一段话: 何取觀史,當如身在其中,見事之利害,時之禍患,必掩卷自思,使我遇此等事,當作如何處之,如此觀史,學問亦可以進,知識亦可以高方為有益。 —— [宋]吕祖谦 上面这段话的意思很简明,却提出了一种非常优秀的读史的方法,把自己带入历史之中去做决策,从而增长自己的阅历。 还有一种方法… 设想一个情景,当我们突然面临一个重大决策时,我们很难短时间内去提高前两种能力,我们收集的信息也十分有限,我们该怎么办? 寻求经验更丰富的人的指点。 但是这里也有坑,一种情况是高人其实不靠谱,他并没有那么“高”,或者他缺乏类似的经验与信息。另一种情况则是高人自己判断错了,这一点没办法避免。所以可能的理想的情况是从高人那里了解他决策的理由、决策的背景,然后对这一决策进行判断。 还有一种情况就是,觉得自己的认知比对方更正确,于是尽管对方可能给了相对正确的判断,你却不相信,还是坚持自己的选择。犯这种错误的人可能最多。 迷思 想要做出决策,其实还涉及到了不少问题。比如情绪干扰,比如看似无法解决的客观问题,使得人很难理性地做出最好的选择。 所以不厌其烦地再说一次:请三思而后行。

September 15, 2020 · 飞羽醉月