这些知识决定了程序员的上限

标签: 知识 程序员 | 发表时间:2019-04-22 19:29 | 作者:
出处:http://www.rowkey.me/

讲述决定程序员上限的一些知识技能点,包括如何学习、如何阅读源码、计算机科学基础知识体系等。

什么是程序员?

  • 码农、程序猿、程序媛
  • 使用 程序实现价值
  • 程序=数据+算法
  • 软件=程序+软件工程
  • 程序员=工程师?

程序员金字塔

程序员知识结构

  • 面试造火箭,工作打蚊子
  • 会什么是你的下限,能够会什么是你的上限
  • 越底层的东西越决定上限

学习欲望

杜绝 1年工作经验重复 N

  • 如果自己遇到这种问题会怎么解决,与资料中的解决方案相比优劣如何?
  • 别人为什么会想到这种解决方案?
  • 自己是由于经验欠缺还是技能点欠缺才导致没有想到好的解决方案?
  • 解决这类问题的根本思路是什么样的?

学习能力

不是懂得多,而是学得快

  • 知其然更要知其所以然:技术以深度优先
  • 类比现实:对现实世界的模拟
  • 更好地接受信息:建立自己的知识体系;阅读并记笔记,纳入知识体系
  • 深度思考:阅读书籍
  • 动手实践、频繁练习:项目驱动型学习;主动思考
  • 自我总结:完善知识体系;笔记、博客、分享
  • 持续学习:逃离舒适区;学到老,活到老

如何学习新技术

如何阅读源码

  1. 阅读该技术的架构文档,了解其总体架构和组成
  2. 根据总体架构,将源码文件以模块或者上下层级进行分类。
  3. 从未阅读过的模块中选择最独立(依赖性最小)的模块代码读起。
  4. 阅读此模块的功能介绍文档。
  5. 阅读此模块的源代码: 运行程序,断点调试
  6. 一边阅读一边整理调用关系图。
  7. 转到第三步。

参考 官方文档或者经典书籍

计算机思维

  • 冯.诺依曼体系:程序存储,顺序执行。
  • 二进制存储:用比特解决问题
  • 位运算:位运算的高效
  • 逻辑分支:条件判断、循环、迭代、递归

个人规划

  • 长期规划:职业规划;高瞻远瞩
  • 短期规划:具体技能、晋升、学习方面的规划;优先级排序

基础学科

  • 物理:电路原理;量子计算机
  • 数学:工程优化;线性代数;微积分
  • 英语!!:阅读英文文献;计算机术语

计算机组成原理

计算机的硬件组成和运行原理

  • 冯诺依曼体系摩尔定律阿曼达定律
  • 数据的机器表示:原码、补码、反码、浮点数/定点数
  • 指令系统:复杂指令集、简单指令集
  • 存储器:分类、缓存
  • CPU: 流水线、伪共享、缓存
  • IO设备:IO总线、DMA、中断

计算机操作系统

屏蔽计算机硬件的中间层

  • 作业调度: 调度策略、优先级
  • 进程管理:进程和线程、进程间通信
  • 存储管理:内存、虚拟内存、文件系统、页、页缓存
  • IO管理:IO设备读写操作
  • Linux操作系统

计算机网络

单个计算机之间的互连

  • TCP/IP协议栈:四层/七层
  • TCP连接状态
  • TCP与UDP的区别
  • HTTP协议、RESTful规范
  • 网络安全
  • 下一代互联网:IPv6、物联网、5G

编译原理

将代码转换成机器可理解的二进制,有助于实现DSL

  • 词法分析、语法分析
  • 类型检查
  • 运行时环境、中间代码
  • 代码生成、代码优化

数据结构和算法

程序=数据+算法

  • 基本数据结构:数组、链表、栈、队列、哈希表
  • 最大堆、最小堆:TopN问题
  • :平衡二叉树、B树、B+树、红黑树
  • 跳跃表: 简单可实现
  • 经典排序算法:快速排序、归并排序、插入排序、冒泡排序
  • 经典查找算法:顺序查找、二分查找
  • 高级算法:贪心、分治、回溯、动态规划
  • 大数据处理:Bitmap、Bloomfilter、Hyperloglog、MapReduce、MPP

设计模式

软件可复用、可扩展、可维护。善用而不滥用。

  • 面向对象SOLID设计原则:单一职责、开闭原则、里氏代换、接口隔离、依赖倒转
  • 常用设计模式:单例模式、工厂模式、代理模式、适配器模式、观察者模式
  • 常用框架中的设计模式:Spring

相关 [知识 程序员] 推荐:

每个程序员都应该了解的磁盘知识

- Adam - NoSQLFan
虽然我们可能经常都在说 SSD 时代即将来临,可能我们今天的建立在磁盘结构上的很多知识都将无用武之地,但毕竟当前很多的存储产品,包括很多NoSQL产品,都是建立在磁盘存储的理论基础上的. 下面是一个关于磁盘原理的PPT,描述了磁盘存储的各种知识. 为什么初创公司适合/不适合用NoSQL. Red Hat正考虑发力NoSQL/Hadoop.

程序员都应该了解哪些安全知识

- - 东西-科技
导读:本文来自StackOverflow上的一个问答贴. 网友 M.H 提问: 我是一名IT专业学生,现在是大三,直到现在我们才开始学习很多计算机相关的课程(编程、算法、计算机体系结构、数学等……). 但是还有一个叫“安全”的世界离我们很远,我是指:计算机安全、互联网安全、网络安全、Hacking、破解等.

每个程序员都应该了解的内存知识

- - 博客 - 伯乐在线
英文原文 What every programmer should know about memory, Part 1,翻译: 开源中国. [ 编辑的话: Ulrich Drepper最近问我们,是不是有兴趣发表一篇他写的内存方面的长文. 我们不用看太多就已经知道,LWN的读者们会喜欢这篇文章的.

作为程序员,不得不知道的App推广知识

- - ITeye博客
初看这个题目,大家可能就疑问,作为程序员只管做自己的产品就好了,写代码就OK了,我干嘛要知道一些推广知识,跟我没关系,不需要知道. 你是否也像我一样以后做个产品经理,项目CTO,项目CEO这样的有抱负,还是默默无闻的做个简单的程序员,从码农到码圣的升级版程序员. 你是否也像我一样以后的职业规划不仅仅局限于程序员这个角色,而不想突破垂直职业的牢笼,从剑客到武林盟主的蜕变.

这些知识决定了程序员的上限

- - 后端技术杂谈 | 飒然Hang
讲述决定程序员上限的一些知识技能点,包括如何学习、如何阅读源码、计算机科学基础知识体系等. 会什么是你的下限,能够会什么是你的上限. 杜绝 1年工作经验重复 N年. 如果自己遇到这种问题会怎么解决,与资料中的解决方案相比优劣如何. 别人为什么会想到这种解决方案. 自己是由于经验欠缺还是技能点欠缺才导致没有想到好的解决方案.

程序员需要了解的硬核知识之CPU

- - SegmentFault 最新的文章
大家都是程序员,大家都是和计算机打交道的程序员,大家都是和计算机中软件硬件打交道的程序员,大家都是和 CPU打交道的程序员,所以,不管你是玩儿硬件的还是做软件的,你的世界都少不了计算机最核心的 - CPU. CPU 的全称是 Central Processing Unit,它是你的电脑中最 硬核的组件,这种说法一点不为过.

为什么每个程序员都应该学习代码编译器知识

- - 外刊IT评论
所有优秀的计算机科学学院都提供了编译器课程,但是相对比较少的学校把它作为本科课程的必修部分. 这篇文章回答了这个问题:为什么需要学习编译器知识. 我写这篇文章的其中一个原因是,尽管我在读本科时很喜欢编译器课程,但是我几乎看不到它的实际作用. 大多数资料看起来要么简单易懂,要么很深奥(事实上,我找到的大部分编译器资料都是很枯燥的.

程序员是懒惰反复无常的伪知识分子,果真如此吗?

- fyits0 - cnBeta.COM
“计算机编程中极少人是真正的艺术家,大多数人充其量不过是房屋粉刷匠而已. 管理顾问 Tim Bryce 不喜欢程序员,而许多程序员也不喜欢他. (注:Tim Bryce 发布过一篇名为《P理论:管理程序员的哲学》的文章.

工作多年的.NET程序员,是否建立了自己的开发知识库?分享制作电子书的经验

- L - 博客园-首页原创精华区
经过多年的编程经验的积累,工作中肯定会遇到很多问题,也都通过各种办法解决了. 无论是上网搜索,或是向同事寻求帮忙,在遇到问题时,都会把这个系列的问题的网页都保存起来,以便以后查找起来方便. 这样,随着时间的积累,知识库的内容会越来越多,如何整理这些文件,方便查找,一直是工作之外努力的方向. 曾经用EverNote建立各种知识库,如下图所示,定期抽出时间,在网上搜索,看到好的文章,都剪贴下来.

普通程序员、文艺程序员、2B程序员

- 可可 - 宇宙的心弦
希望能引起广大苦逼的正在学或者已经学过c++人的共鸣和会心一笑吧. 如何辨别自己在现实还是虚拟世界.