说说我理解的职业开发人员

本文由Yurii原创,转载请注明来源: 乱象,印迹

本文链接 说说我理解的职业开发人员


应人民邮电出版社图灵公司的邀请,我有幸参与了Bob大叔所著Clean Coder(不是Clean Code)的翻译。

与前作Clean Code不同,这本书着重讲述的是开发人员的“职业素养”,也即职业开发人员应当如何做事。在阅读中,我时常会忍俊不禁,也会拍案叫绝,感叹Bob大叔把深刻的道理讲得这样通透。我虽然没有Bob大叔那样好的文笔,不过对“开发人员的职业素养”这个话题,也有很多话想说,索性分几个方面写下来。

学习

开发人员在工作之前,一般都已经经过大学阶段的专业学习。众所周知,大学的很多课程已经相当落后,教材也非常保守,所以我见过的好开发人员,不少都是自学成才。但是,这些问题并不能否认通过专业课程学习知识的意义,职业开发人员理解的“学习”,应当明确地区分知识、课程、教材:知识是重要的、稳定的,课程和教材是不那么重要的、变化的。

可以非常肯定地说,数据结构、编译原理、操作系统这类知识,是整个计算机世界的基石,是任何时候也不会过时的。即便毕业后不从事专门的科研,这类知识也会从你接触到的各种现象中体现出来。我在大学时基本抛弃了学校指定的课程和教材,但自己反复啃过影印版的《现代操作系统》,反复做过北大屈婉玲老师的三本《离散数学习题集》,后来在工作中受益匪浅——调优程序的性能,很可能需要理解调度、死锁、用户空间与系统空间等知识;重构复杂的布尔逻辑,很可能要依赖数理逻辑中的定律。如果当时没有反复的研习,没有深入理解这背后的原理,并且没有领悟到这些原理和各种现象之间的联系,遇到很多问题我很可能就会两眼抓瞎,充其量凭经验试错,无论如何,其效率远不及知识体系指导下的实践。

据我观察,大学生之所以对课程不感冒,除去学校和教师的原因,另一个因素是,几乎很少有教材能把看起来乏味的原理,和生活中遇到的问题讲清楚。学习图算法时,你是否想过“人、狼、羊、草过河”的问题可以直接由它来解决?学习内存管理时,你是否想过为什么Windows 95、Windows 98都那么容易蓝屏,到了Windows XP才有了长足的进步?我相信,如果能把原理与这类例子对应起来,你的理解就会深刻许多,印象也会深刻许多。不幸的是,这类“打通/联系”的工作,在国内教材基本是一片空白,国外教材也只有部分涉及。其结果就是,不少“有经验”的开发人员面对“32位机为什么只能支持4G内存”、“进程间通讯有哪几种方式,各有什么优劣”、“浮点数是怎么表示的,为什么是不准的”之类基本问题一脸茫然,不要小看了这些问题,不懂它们,你开发出来的程序只能凑合用,因为根子上就欠考虑,所以后期遇到问题要重构和调优,就会难比登天,最终搞到自己疲惫不堪。

对此,我的建议是:如果你现在还在学校,不妨仔细想清楚知识、课程、教材之间的关系,确定重要的知识,选择好的教材,自己安排自己的课程。如果你已经离开学校,而且感觉自己的基础并不牢靠,不妨从手头的工作开始,想想它用到了哪些原理,对应哪些知识,逐步、有针对性地补习。这其实并不难——我的朋友张东亮(@zhasm),之前几乎没有任何计算机基础知识,只是因为对正则表达式的爱好,找到了一份开发人员的工作,一年之后,他已经开始啃编译原理的书籍,而且确实学进去了。

以上说的主要是“专门”的学习,如果是工作之后的学习,会有很大的不同。

首先,工作之后的学习更多依靠自觉,没有几家公司会付出代价让员工像学生那样“学习”,所以更多时候,你只能花自己的时间、自己的金钱来学习。很多人一想到要花自己的时间,自己的金钱,心里就打了退堂鼓。要明确的是,公司没有老师那样强烈的责任培养员工“成长”,如果你找不到好的、薪水高的工作,很难责怪上一家公司没提供好的培训。所以,担心金钱和时间而放弃学习,最终的结果是自己的停滞,逐渐丧失竞争优势。相反,投入时间和金钱来学习,不但可以保持甚至扩大你的竞争优势,如果这种行为可以坚持、内化到生活中,也有助于保持健康、饱满的精神状态。

其次,工作以后的学习,需要努力摆脱工作环境的限制。我见过不少开发人员,因为工作限定在某个平台,某种语言,业余时间的学习便全部投入到这种平台、这种语言上,而没有思考自己是否合适做这些平台和语言,这些平台和语言是否处于没落期。在学校里,考分或许往往是唯一的度量,但在工作中,行将没落的语言和平台,你运用得再熟练,也于事无补。况且,过于专精于一门语言、一个平台,反而会限制你的思维和视野,影响迅速学习陌生知识的能力——要在短时间内熟悉陌生平台和语言的例子,在我们工作中并不少见,在整个IT业界中更是家常便饭。为了让它真的成为“便饭”,平时还是应当有意识地摆脱工作环境的限制,挑战自己的思维惯性。

责任

我曾经见过很多的简历,在“工作经历”里,项目描述写得天花乱坠,如何先进,如何复杂,采用了多少新技术,但是具体到个人责任,或者语焉不详,或者极其潦草。这样简历,体现的是责任感的缺失——对于自身责任没有明确的认知,也就没有足够的担当;这样的人,通常不用面试,就可以知道并不是合格的“职业开发人员”。

另一方面,我在面试时,经常会问两个问题,其中很重要的一个是:在你的工作经历中,收获最大或者印象最深的事件是什么。一般来说,如果能回答得有条理、有依据,大多可以判定为合格的职业开发人员。因为,有责任感的开发人员,大多不会把程序看成身外之物,更多地会把程序与自己的道德、声誉等等联系起来,甚至把程序看成自己的孩子;所以,必然会投入时间精力去总结、反思、完善、改进,就像照顾自己的孩子那样。其实,就我的经验看,真正的职业开发人员,不但能很好地回答这个问题,而且说起自己做过的事情,多有种充沛的自信感:XX项目是我做的,其特点是什么,我是如何如何做的,遇到什么问题,是如何解决的……涉及的技术不必很先进,开发的系统也不必很复杂,只要能够这么自信满满地一条条历数下来,你的职业素养就是无可厚非的。

业务

软件开发中,需求变化是无可避免的。虽然敏捷开发、极限编程宣称要“拥抱变化”,但真正做到拥抱变化,却是难上加难。原因在于:一方面,不少开发人员对变化本身就持怀疑甚至抵触态度;另一方面,许多需求完全是无规则、无理由地变化,不但造成极大的浪费,也严重影响开发人员的情绪。

这个问题非常普遍,也很严重。我思考了很久,发现比较合适的解决办法是进行角色的互换,尤其是开发方(包括开发人员),不能局限于“按照规程实现功能”的角色,而应当深入思考和理解业务。

不少开发人员最“理想”的工作环境就是:根本不关心自己的工作成果给谁用,怎么用,会产生什么结果,他们更喜欢这样的描述:什么类型的数据从哪里来,怎样处理之后,最后交给哪里。在架构清晰、流程完备的大公司里,或许你只需要安心填格子即可,但是拥有这样工作环境的开发人员,占总数的多少呢?更多的人面对的还是变化不定的需求,甚至连业务部门自己都不清楚自己要的是什么,这种情况下,只关心“数据从哪里来,怎样处理,交给哪里”之类的问题,无异于盲人骑瞎马,无异于挖坑埋葬自己。

相反,如果你清楚某个实现方案的缘由,知道它是基于何种应用场景,如何设计出来的,就可以在相当程度上把握它的价值和所需的工作量。如果更主动一些,可以和业务部门谈,这么做,将来会遇到什么问题,如果将来要改,哪些环节是可以改的,哪些环节是不能改的——如果你设身处地地为对方考虑,给出的建议一定比技术味道浓厚的“做不出来”更有说服力。如果做不到这么主动,你也可以预估,哪些业务是稳定不变的,哪些业务是一定会遇到问题需要改变的,然后可以合理分配工作量:对那些明显没什么前途的项目,可以适当保留资源,以免将来竹篮打水;对那些目前业务部门认为不重要,其实又相当有价值的项目,可以适当多投入精力,以免将来措手不及——要知道,业务部门提的“紧急”需求,多半不会考虑开发的工作量。

需要补充的是,做到上面这点,其实有相当的难度:一方面,你的技术功底必须足够扎实,在满足需求时,不仅仅是“模仿”现实,而应当知道这种现实,在数字世界里应当如何表达,如何重构,受到哪些条件和规则的限制(比如同一个抽象操作的不同实现,到底是选择Switch语句还是多态,其实是有章可循的,必须根据实际情况选择);另一方面,又要能跳开技术的局限,从更全面的视角理解、把握业务。不过,这是非常值得花功夫的——从某种意义上可以说,当前热门的“领域驱动开发(Domain Driven Development)”,说的大抵就是这回事。

时间

在软件开发中,时间绝对是一个非常重要的因素。在这方面,已经有无数的巨著,无数的案例,无数的先烈,但是时间,仍然是一个值得讨论的话题。

总的来说,人月是一个神话,我们不可能绝对精确地把握开发时间,但是这并不意味着,我们不能从某种程度上把握时间。我个人的经验是,计划是在现实参照下的不断调整和修正中逐渐准确的。最重要的,并不是确定远大的目标,然后限定多长时间必须完成;而是可以把大的项目拆分为不同的模块,把整个开发流程划分为不同的阶段。如果你的模块划分得足够细致,就可以以每个模块的工作量,相对准确地得知整个项目的耗时;如果你的流程划分得足够合理,就可以在各个阶段拿出看得见、用得着的结果,供业务方使用。这样,一方面避免了“到最后一起推出,却发现与业务方想象大相径庭”的尴尬;另一方面,在开发过程中,每个阶段结束,就可以提供一个阶段的生产力,作为开发方,在面对质疑时,有足够的资本和底气。

从个人方面,我注意到,职业开发人员还有另一个特点:就是可以相当精确地估计某个“小活”的工作量。以我自己和我的一些朋友为例,面对一些细致而且明确的需求,我们经常可以精确估计到工作量,时间精确到以半小时计。在紧密协作的“背靠背”编程中,我会说:现在是几点,所以我会在几点之前,给你提供怎样的功能,其行为是怎样的,接口是怎样的(行为和接口可以事先约定)。这样的自信,既要求对所需技术、会遇到难题的把握,也要求在头脑里对任务有完整清晰的模型。虽然难度不小,但能做到这一点,确实是职业素养的典型体现。

【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI完整复现】【DRCC】考虑N-1准则的分布鲁棒机会约束低碳经济调度(Matlab代码实现)》的技术资源,聚焦于电力系统中低碳经济调度问题,结合N-1安全准则与分布鲁棒机会约束(DRCC)方法,提升调度模型在不确定性环境下的鲁棒性和可行性。该资源提供了完整的Matlab代码实现,涵盖建模、优化求解及仿真分析全过程,适用于复杂电力系统调度场景的科研复现与算法验证。文中还列举了大量相关领域的研究主题与代码资源,涉及智能优化算法、机器学习、电力系统管理、路径规划等多个方向,展示了广泛的科研应用支持能力。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源调度、智能电网相关工作的工程师。; 使用场景及目标:①复现高水平期刊(如EI/SCI)关于低碳经济调度的研究成果;②深入理解N-1安全约束与分布鲁棒优化在电力调度中的建模方法;③开展含新能源接入的电力系统不确定性优化研究;④为科研项目、论文撰写或工程应用提供可运行的算法原型和技术支撑。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与案例数据,按照目录顺序逐步学习,并重点理解DRCC建模思想与Matlab/YALMIP/CPLEX等工具的集成使用方式,同时可参考文中列出的同类研究方向拓展研究思路。
内容概要:本文详细介绍了一个基于MATLAB实现的电力负荷预测项目,采用K近邻回归(KNN)算法进行建模。项目从背景意义出发,阐述了电力负荷预测在提升系统效率、优化能源配置、支撑智能电网和智慧城市建设等方面的重要作用。针对负荷预测中影响因素多样、时序性强、数据质量差等挑战,提出了包括特征工程、滑动窗口构造、数据清洗与标准化、K值与距离度量优化在内的系统性解决方案。模型架构涵盖数据采集、预处理、KNN回归原理、参数调优、性能评估及工程部署全流程,并支持多算法集成与可视化反馈。文中还提供了MATLAB环境下完整的代码实现流程,包括数据加载、归一化、样本划分、K值选择、模型训练预测、误差分析与结果可视化等关键步骤,增强了模型的可解释性与实用性。; 适合人群:具备一定MATLAB编程基础和机器学习基础知识,从事电力系统分析、能源管理、智能电网或相关领域研究的研发人员、工程师及高校师生;适合工作1-3年希望提升实际项目开发能力的技术人员; 使用场景及目标:①应用于短期电力负荷预测,辅助电网调度与发电计划制定;②作为教学案例帮助理解KNN回归在实际工程中的应用;③为新能源接入、需求响应、智慧能源系统提供数据支持;④搭建可解释性强、易于部署的轻量级预测模型原型; 阅读建议:建议结合MATLAB代码实践操作,重点关注特征构造、参数调优与结果可视化部分,深入理解KNN在时序数据中的适应性改进方法,并可进一步拓展至集成学习或多模型融合方向进行研究与优化。
<think>好的,我现在要帮用户理解计算机公司研发岗位的情况。首先,用户可能对研发岗位的具体职责不太清楚,或者想转行进入这个领域,需要一些指导。我需要先明确研发岗位的核心职责,比如需求分析、架构设计、编码实现、测试优化这些环节。然后,考虑用户可能关心的技能要求,比如编程语言、算法、框架工具等。还要区分不同的研发方向,比如前端、后端、算法工程师,这样用户可以根据自己的兴趣选择。 接下来,用户可能想知道研发岗位的挑战,比如技术更新快、复杂问题解决、团队协作压力。这些点需要具体举例说明,让用户有更直观的认识。另外,职业发展路径也是重点,比如从初级到高级再到架构师或管理岗位的晋升路线,以及不同公司的晋升机制差异。 可能用户还会关心研发岗位的行业价值,比如技术创新如何推动产品竞争力,研发与产品、市场部门的关系,以及长期职业规划的建议,比如技术深度与广度的平衡,软技能的重要性。需要提醒用户注意持续学习和适应变化的重要性,同时保持热情。 在组织回答时,要结构清晰,分点阐述,每个部分用简短的标题,便于阅读。同时,使用例子和实际场景帮助用户理解抽象概念,比如提到电商系统的高并发场景,说明研发人员需要解决的问题。还要注意语言口语化,避免过于专业术语,让不同背景的用户都能理解。 最后,检查是否符合用户给的系统级指令,比如数学公式的格式是否正确,这里可能涉及算法中的公式,比如时间复杂度O(n),但用户的问题主要关于研发岗位,可能数学公式较少,但如果有提到算法复杂度,需要用正确的LaTeX格式。同时确保回答用中文,结构层次分明,帮助用户逐步了解研发岗位的全貌。</think>### 对计算机公司研发岗位的阶段性理解 #### 一、核心职责与技术定位 1. **需求转化与实现** - 研发岗位的核心是将业务需求转化为技术方案。例如:电商系统中“秒杀功能”需通过分布式锁、缓存预热、限流算法(如漏桶/令牌桶)等技术实现。 - 需平衡性能(如QPS≥10万)、可靠性(99.99%可用性)、安全性(防超卖/防爬虫)等多维度指标。 2. **技术攻关** - 解决复杂场景问题,如推荐系统的实时特征计算需在5ms内完成,可能涉及Flink流处理+Redis向量检索的混合架构。 - 典型技术挑战案例:视频编码算法优化(如H.265→AV1)可降低30%带宽成本。 #### 二、关键能力模型 1. **硬技能栈** | 层级 | 内容举例 | 应用场景 | |---|---|---| | 基础 | 数据结构(B+树索引)、网络(QUIC协议) | 数据库优化/弱网传输 | | 进阶 | 分布式共识算法(Raft/Paxos) | 微服务注册中心设计 | | 专项 | CUDA并行计算/Transformer模型 | GPU加速/大语言模型部署 | 2. **工程化能力** - 代码质量:需通过SonarQube静态扫描(0严重漏洞)、单元测试覆盖率(≥80%) - DevOps实践:CI/CD流水线构建时长压缩(如从40分钟优化至8分钟) #### 三、研发流程全景 ```mermaid graph TD A[需求评审] --> B(技术方案设计) B --> C{方案评审} C -->|通过| D[编码实现] D --> E(单元测试) E --> F[Code Review] F --> G(集成测试) G --> H[灰度发布] H --> I{线上监控} I -->|异常| J[快速回滚] ``` #### 四、职业发展双路径 1. **技术纵深路径** - 示例:Java工程师→JVM调优专家(GC暂停从200ms降至20ms) - 关键技术里程碑:主导开源项目(如Apache顶级项目Committer) 2. **横向拓展路径** - 技术管理:50人团队效能提升(通过敏捷改造将迭代速度提升2倍) - 产品技术融合:主导AI客服系统设计,使人力成本降低40% #### 五、行业趋势适配 1. **前沿技术追踪** - 量子计算:需关注Q#语言与量子纠错算法 - 云原生:Service Mesh下沉到芯片层(如AWS Nitro系统) 2. **研发范式进化** - AI辅助编程:GitHub Copilot使代码生成效率提升55% - 低代码平台:复杂业务表单配置化开发(从7人天→2小时) #### 六、价值创造维度 - **直接经济价值**:某推荐算法优化带来GMV提升12% - **技术资产沉淀**:构建统一监控平台,故障定位时间从4小时→15分钟 - **行业标准参与**:主导制定边缘计算国家标准(GB/T XXXXX-2023) ### 总结建议 研发岗位本质是**系统性创新**的过程,建议从业者: 1. 建立T型能力结构:1-2个领域深度(如K8s调度算法)+多领域认知(如芯片指令集对编译优化的影响) 2. 培养技术产品化思维:将技术方案封装为可复用的中间件(如分布式ID生成服务) 3. 关注技术经济学:评估技术选型的ROI(如自研vs开源方案的全生命周期成本)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值