程序员竞争力进阶指北

这两天在逛社区时,偶然看到一个程序员竞争力矩阵,感觉不管是选择卷,还是选择躺,搞技术的都应该渐进式提高自己的能力,对自己的能力发展做一个计划,而这个表格则可以作为一个路标参考,让我们在技术上不断进步。

这个竞争力矩阵涵盖了计算机科学、软件工程、编程、经验和知识等多个方面。

计算机科学

数据结构

  • Level 0: 不了解数组和链表的区别
  • Level 1: 能够在实际编程任务中解释和使用数组、链表、字典等基本数据结构
  • Level 2: 熟悉基本数据结构的空间和时间权衡,如数组 vs 链表,能够解释哈希表的实现原理并处理冲突,了解优先队列及其实现方式等
  • Level 3: 掌握高级数据结构,如B树、二项堆、斐波那契堆、AVL/红黑树、伸展树、跳表、Trie等

算法

  • Level 0: 无法找到数组中数字的平均值
  • Level 1: 掌握基本的排序、搜索和数据结构遍历和检索算法
  • Level 2: 理解树、图、简单的贪心算法和分治算法,并能够理解这些矩阵级别的相关性
  • Level 3: 能够识别和编写动态规划解决方案,熟悉图算法和数值计算算法,能够识别NP问题等

系统编程

  • Level 0: 不了解编译器、链接器或解释器是什么
  • Level 1: 基本了解编译器、链接器和解释器,理解汇编代码以及硬件层面的工作原理,了解虚拟内存和分页等知识
  • Level 2: 理解内核模式与用户模式、多线程、同步原语及其实现方式,能够阅读汇编代码,了解网络工作原理、网络协议和套接字级编程等知识
  • Level 3: 理解整个编程栈,包括硬件(CPU + 内存 + 缓存 + 中断 + 微码)、二进制代码、汇编语言、静态和动态链接、编译、解释、JIT编译、垃圾回收、堆栈、内存寻址等知识

软件工程

源代码版本控制

  • Level 0: 只会通过备份文件夹来进行版本控制
  • Level 1: 了解VSS和初级的CVS/SVN用户
  • Level 2: 熟练使用CVS和SVN的功能,了解分支、合并、使用补丁、设置仓库属性等操作
  • Level 3: 掌握分布式版本控制系统,尝试过Bzr/Mercurial/Darcs/Git等工具

构建自动化

  • Level 0: 只会通过IDE进行构建
  • Level 1: 能够通过命令行进行系统构建
  • Level 2: 能够编写脚本来构建基本系统
  • Level 3: 能够编写脚本来构建系统、生成文档、安装程序、生成发布说明并在源代码控制中标记代码版本

自动化测试

  • Level 0: 认为所有测试都是测试人员的工作
  • Level 1: 编写自动化单元测试,并为正在编写的代码提供良好的单元测试案例
  • Level 2: 以测试驱动开发(TDD)方式编写代码
  • Level 3: 理解并能够设置自动化功能、负载/性能和UI测试

编程

问题分解

  • Level 0: 只会编写直线式代码,复制粘贴以实现重用
  • Level 1: 能够将问题分解为多个函数
  • Level 2: 能够设计解决整体问题的可重用函数/对象
  • Level 3: 使用适当的数据结构和算法,编写封装问题中易变部分的通用/面向对象代码

系统分解

  • Level 0: 无法超越单个文件/类的层次进行思考
  • Level 1: 能够将问题空间分解并设计在同一平台/技术范围内的解决方案
  • Level 2: 能够设计跨多个技术/平台的系统
  • Level 3: 能够可视化和设计具有多个产品线和与外部系统集成的复杂系统。还应能够设计监控、报告、故障转移等运维支持系统。

沟通能力

  • Level 0: 无法向同行表达思想/观点,拼写和语法错误严重
  • Level 1: 同行能够理解所表达的内容,拼写和语法良好
  • Level 2: 能够与同行有效沟通
  • Level 3: 能够以明确的方式理解和沟通思想/设计/观点/规范,并根据上下文调整沟通方式

文件内代码组织

  • Level 0: 文件内没有组织的迹象
  • Level 1: 方法按逻辑或可访问性进行分组
  • Level 2: 代码按区域进行分组,并有良好的注释和对其他源文件的引用
  • Level 3: 文件具有许可头、摘要、良好的注释和一致的空格使用。文件应该看起来美观。

文件间代码组织

  • Level 0: 未考虑代码在文件间的组织
  • Level 1: 相关文件被组织到一个文件夹中
  • Level 2: 每个物理文件具有唯一的目的,例如一个类定义、一个功能实现等
  • Level 3: 物理级别的代码组织与设计紧密匹配,通过查看文件名和文件夹分布可以了解设计

源代码树组织

  • Level 0: 所有内容都在一个文件夹中
  • Level 1: 将代码基本分离为逻辑文件夹
  • Level 2: 无循环依赖,二进制文件、库、文档、构建、第三方代码都有适当的文件夹组织
  • Level 3: 源代码树的物理布局与逻辑层次结构和组织相匹配。目录名称和组织方式提供了对系统设计的见解。

代码可读性

  • Level 0: 单音节命名
  • Level 1: 文件、变量、类、方法等具有良好的命名
  • Level 2: 无过长的函数,注释解释了不寻常的代码、错误修复、代码假设
  • Level 3: 使用断言验证代码假设,代码流程自然流畅,没有深层嵌套的条件语句或方法

防御性编程

  • Level 0: 不了解防御性编程的概念
  • Level 1: 检查所有参数并在代码中断言关键假设
  • Level 2: 确保检查返回值并在可能失败的代码周围检查异常
  • Level 3: 拥有自己的防御性编程库,编写模拟故障的单元测试

错误处理

  • Level 0: 只编写正常情况下的代码
  • Level 1: 在可能引发异常/错误的代码周围进行基本的错误处理
  • Level 2: 确保错误/异常使程序处于良好状态,正确清理资源、连接和内存
  • Level 3: 编写能够检测可能异常的代码,保持一致的异常处理策略,为整个系统提供异常处理指南

集成开发环境(IDE)

  • Level 0: 大多数情况下只使用IDE进行文本编辑
  • Level 1: 熟悉界面,能够使用菜单有效地使用IDE
  • Level 2: 熟悉大多数常用操作的键盘快捷键
  • Level 3: 编写自定义宏

应用程序编程接口(API)

  • Level 0: 需要经常查阅文档
  • Level 1: 将最常用的API记在脑中
  • Level 2: 对API有广泛而深入的了解
  • Level 3: 编写基于API的库,简化常用任务并填补API的空白

框架

  • Level 0: 仅使用核心平台之外的框架
  • Level 1: 听说过流行的框架,但未使用过
  • Level 2: 在专业环境中使用过多个框架,并熟悉框架的惯用法
  • Level 3: 框架的作者

经验

专业经验中使用的编程语言

  • Level 0: 命令式或面向对象
  • Level 1: 命令式、面向对象和声明式(SQL),如果了解静态与动态类型、弱类型与强类型以及静态推断类型等概念,将获得额外加分
  • Level 2: 函数式,如果了解惰性求值、柯里化、延续等概念,将获得额外加分
  • Level 3: 并发(Erlang、Oz)和逻辑(Prolog)

专业经验中使用的平台

  • Level 0: 1个平台
  • Level 1: 2-3个平台
  • Level 2: 4-5个平台
  • Level 3: 6个以上平台

专业经验年限

  • Level 0: 1年
  • Level 1: 2-5年
  • Level 2: 6-9年
  • Level 3: 10年以上

领域知识

  • Level 0: 对领域没有了解
  • Level 1: 在该领域至少参与过一个产品的开发
  • Level 2: 在同一领域中参与过多个产品的开发
  • Level 3: 领域专家,设计和实施了多个产品/解决方案,熟悉领域中的标准术语和协议

知识

工具知识

  • Level 0: 仅限于主要的IDE(如VS.Net、Eclipse等)
  • Level 1: 了解一些流行和标准工具的替代方案
  • Level 2: 熟悉编辑器、调试器、IDE、开源替代方案等。例如,熟悉Scott Hanselman的Power Tools列表中的大多数工具,并使用过ORM工具。
  • Level 3: 实际编写和发布工具和脚本,如果已发布,将获得额外加分

接触过的编程语言

  • Level 0: 命令式或面向对象
  • Level 1: 命令式、面向对象和声明式(SQL),如果了解静态与动态类型、弱类型与强类型以及静态推断类型等概念,将获得额外加分
  • Level 2: 函数式,如果了解惰性求值、柯里化、延续等概念,将获得额外加分
  • Level 3: 并发(Erlang、Oz)和逻辑(Prolog)

代码库知识

  • Level 0: 从未查看过代码库
  • Level 1: 对代码布局和系统构建有基本了解
  • Level 2: 熟悉代码库,已实施多个错误修复和一些小功能
  • Level 3: 在代码库中实施了多个重要功能,能够轻松地想象大多数功能或错误修复所需的更改

对新技术的了解

  • Level 0: 从未听说过即将推出的技术
  • Level 1: 听说过领域中即将推出的技术
  • Level 2: 下载了预览版/CTP/测试版并阅读了一些文章/手册
  • Level 3: 通过预览版实际构建了一些东西,并额外加分如果与其他人共享

平台内部原理

  • Level 0: 对平台内部工作原理一无所知
  • Level 1: 对平台内部工作原理有基本了解
  • Level 2: 深入了解平台内部工作原理,能够想象平台如何将程序转换为可执行代码
  • Level 3: 编写增强或提供有关平台内部信息的工具,例如反汇编器、反编译器、调试器等

书籍

  • Level 0: 《Unleashed系列》、《21天系列》、《24小时系列》、《Dummies系列》等
  • Level 1: 《代码大全》、《Don’t Make Me Think》、《精通正则表达式》等
  • Level 2: 《设计模式》、《人件》、《编程珠玑》、《算法设计手册》、《务实的程序员》、《人月神话》等
  • Level 3: 《计算机程序的构造和解释》、《概念技术》、《计算机编程的模型》、《计算机程序设计艺术》、《数据库系统》(C.J Date著)、《Thinking Forth》、《Little Schemer》等

博客

  • Level 0: 听说过博客,但从未有时间阅读
  • Level 1: 定期阅读技术/编程/软件工程博客和听播客
  • Level 2: 维护一个包含一些有用文章和工具的链接博客
  • Level 3: 维护一个博客,分享个人对编程的见解和思考

提升建议

根据以上竞争力矩阵列表,我们可以看到不同级别的技能和知识要求。要提升自己的竞争力,以下是一些建议:

  1. 持续学习计算机科学基础知识:加强对数据结构和算法的理解,掌握高级数据结构和算法的应用。

  2. 深入了解系统编程:学习编译器、链接器和解释器的工作原理,了解操作系统、多线程和网络编程等知识。

  3. 掌握软件工程实践:学习源代码版本控制工具,如Git,掌握分支、合并等操作。熟悉构建自动化工具,如Maven或Gradle,能够编写脚本进行系统构建。掌握自动化测试的原理和实践,编写单元测试和功能测试用例。

  4. 不断提升编程能力:培养良好的问题分解能力,将复杂问题拆分为可管理的模块。学习系统分解,设计跨技术和平台的系统。注重沟通能力的提升,能够清晰地表达自己的思想和设计。

  5. 注重代码质量和组织:编写可读性强的代码,使用有意义的命名,避免过长的函数和深层嵌套的条件语句。合理组织文件内和文件间的代码结构,使代码易于理解和维护。

  6. 持续学习和探索新技术:关注行业中的新技术和趋势,阅读相关的技术博客和文档,尝试使用新技术构建项目,并与他人分享经验和见解。

  7. 积累丰富的经验:通过参与实际项目,不断积累专业经验。尝试不同的编程语言和平台,扩展自己的技术广度。深入理解所在领域的知识,成为领域专家。

  8. 广泛阅读和学习:阅读经典的编程书籍,如《代码大全》、《设计模式》等,提升自己的编程思维和技巧。关注优秀的技术博客和文章,保持对行业的关注和学习。

通过不断地学习、实践和积累经验,可以逐渐提升自己的竞争力,成为一名优秀的程序员。持续的学习和自我提升是成为顶尖程序员的关键。Good luck!