Table of Contents:

 关于学习

人的一天有24小时,8小时休息,8小时上班,另外的8小时在干什么就决定了你以后有多大发展。一有时间就看书学习,这就是一个程序员应该做的。今天打游戏,明天看电影,后天炒股,只会导致技术止步不前。

如果希望一辈子走技术的道路,就要有自己的核心竞争力,这个核心竞争力决不是凭以往的经验能够做某些工作的能力,而是学习能力、思考 能力和解决有挑战性的新问题的潜力。

在IT这一行,凭借以往的经验干重复的活是干不长久的,原因很简单,一个问题不会被解决两次,当你发现你的经验能够解决一类问题时,别人早把解决这一类问题的套路编写成framework,新上手的人即使不具备你的这些经验也可以调用framework中的类和函数来解 决问题,然后在这个framework的基础上积累新的经验解决新的问题。正因为如此,全世界开发人员的经验才会积累起来,促使软件技术发展得如此迅速。 这并不是说经验完全没有用,最关键的,学习和思考也是建立在以往经验的基础之上的。另一方面,现有的framework并不一定是某方面开发经验的完美整合,也需要不断发展,用新的办法重新解决老问题,以Web开发为例,从早期的ASP、PHP到后来的.NET、J2EE,到现在的Ruby on Rails、Django等等,这些framework解决的是同一问题,就是如何快速有效地开发Web应用,这方面的经验被不断重新整合,推陈出新。总结一下,什么才是核心竞争力呢?应该是在经验的基础上学习新技术、解决新问题的能力

学习应首先理解基本的框架和思想(这是泛读), 然后是细节(这就是对某些内容的精读),虽然真正的学习往往是混合了这二个过程的过程

 程序员的知识和技能树

作用:
 形成知识框架、知识地图
 遇到问题、知识时可以快速定位,并和已有的知识建立联系
* 排查自己的知识盲区,查漏补缺

 知识

英语


数学
    微积分
    线性代数
    离散数学
    概率论
    


数字电路


计算机组成原理


计算机体系结构


操作系统
    linux
        命令
        shell脚本
        系统编程
        内核原理
        内核源码
    windows


编译原理
    前端
    后端
    
计算机网络
    网络分层
        应用层
            DHCP  PEX  HTTP  HTTPS FTP  RTMP(流媒体协议)
        传输层
            tcp  udp
        网络层
            ip
        链路层
            arp
    网络编程
    工具
        tcpdump  wireshark



数据结构


算法


数据库(数据存储)
    关系型数据库
    非关系型数据库
    k-v型数据库
    内存型数据库




软件工程
    源码版本控制
    自动化编译
    自动化测试


编程语言
    汇编语言
    c
    c++
    python


    编程范式
        命令式语言,面向过程式语言(c)
        面向对象语言(c++)
        函数式语言(lisp)
        逻辑式语言(Prolog)
        并发语言(Erlang) 
        说明型语言(SQL)  领域专用语言(DSL)  


平台经验
    windows、linux、ios、Android、嵌入式


具体行业、领域
    web
        前端 后端
    游戏
    区块链




工具的使用
    编辑器
    调试器
    IDE 
    使用版本控制
        git工作流






见识
    下一代技术知识


    平台内部构件


    书籍
        技术手册类型
        技术进阶类型
            告诉你某些技术在什么情况下运用最为合适等等一些列窍门的书籍
        技术原理类型
        圣典级别类型
        
    博客
        维护一个在编程方面,分享有个人见解和思考的博客
        
```       




## 技能

阅读代码
    快速了解程序的功能,程序的具体行为,语言方面, 数据结构和算法方面
    
软件设计
    使用什么样的代码技术达到怎么样的功能,而系统架构设计直接决定了软件的质量、性能和可维护性
    需求分析
        接受给定的需求和代码规格    
        能对规格的遗漏提出疑问    
        了解全面情况,提出需要被规格化的整体范围。    
        能够提出更好的可选方案,根据经验的浮现给出需求
    问题分解
    系统分解

编写程序
    代码组织
        同一文件、跨文件代码组织、源码树组织
    代码可读性、强健性、防御性编码、错误处理
    工具类库、编程框架的使用
    
    接口api的查找能力(快速上手)
    接口api的使用能力
    接口的封装和设计(功能抽象分封装)
    接口api的实现能力

熟悉软件工程
    每个程序员都应该明白软件工程是什么东西,都应该知道,需求分析,设计,编码,测试,Release和维护这几个阶段
    软件开发的方法论,比如:敏捷开发或瀑布模型。

使用程序库或框架
    一个程序员需要学会使用已有的代码,无论是标论的程序库,或是第三方的,还是自己公司内部的,站在前人的基础上,可以让你的工作事半功倍。

程序调试

单元测试
    单元测试框架

重构代码
    重构目前已有的代码,使代码达到最优但却不能影响任何的已有的功能

开发自动化
    批处理文件、shell脚本、python脚本
    自动化编译,自动化测试,自动化部署,系统集成

运维能力

        

快速学习的技能
    

与人的沟通能力
语言的表达能力
写作能力

团队协作能力
时间管理能力
故障处理能力    
```

 参考链接

程序员需要具备的基本技能, by 酷壳
程序员能力矩阵-译文
Programmer Competency Matrix