这世界上编程语言如此之多, 想学完是不可能的, 也是没有必要的.
一般来说, 一个人能精通一门语言, 然后会使用另外一种语言就不错了.
既然编程语言学不完, 能不能把重点放到编程语言无关的技术上呢?
首先能想到的就是数据结构和算法, 它的重要性已经不用再强调了, 直接跳过.
"负载均衡, 分布式, 集群, 高可用......" 这些 "高深" 的技术在日常 Coding 也不常用, 略过不谈, 主要扒一扒工程中常用的, 编程语言无关的具体技术.
1HTTP
HTTP 诞生于 1991 年, 是互联网领域一个基石性的协议. 全世界电脑上的内容能互联起来, 全拜 HTTP 所赐.
程序员主要通过 HTTP 来传输 XML, JSON 等数据. 日常使用的就是 GET,POST 方法, 但 HTTP 可不仅仅只有这些, 它的细节相当多, 我觉得程序员至少应该掌握这些:
Cookie: domain, path, expiration
HTTP 状态码
HTTP 长连接 , 由此扩展到 websocket.
HTTP 重定向 , 非常有用的技术, 对理解 OAuth, CAS(SSO) 很有帮助.
缓存 :Last-Modified 和 ETag
chunked : 分块传输
代理: 正向代理 / 反向代理
2socket
socket 是对 TCP/IP 的抽象, 网络编程肯定绕不过 socket, 绝大部分语言都提供了 socket 相关的 API.
工作中直接对 socket 编程的机会不多, 大多都是封装好的, 但是要理解 socket 在客户端和服务器端的区别, 服务器端是如何维护连接的, 这就会引出一个重要的技术: I/O 多路复用 (select/poll/epoll) , 也是 ngnix,redis 等著名软件的基础.
I/O 多路复用是 I/O 模型之一, 其他还有同步阻塞, 同步非阻塞, 信号驱动和异步.
这方面最经典的书应该是Unix 网络编程了.
3 安全基础
如果说 socket,HTTP 建立了传输的通道, Hash 技术, 对称 / 非对称加密, 数字签名等安全基础就是安全的守护者.
去看看最近大热的区块链, 会发现这些安全基础是区块链基本的技术支撑.
他们是如此重要, 到处都能看到他们的身影:
HTTPS: 使用 "非对称加密" 来传输 "对称加密的密钥", 使用 Hash, 数字签名来确保身份的合法性.
Secure Shell : 使用 RSA 的方式登录服务器
Hash 的用途更为广泛:
用户密码的存储: 现在基本上没有网站存储明文密码了, 基本上都是把密码加 salt 生成 hash 值以后来保存.
HashMap 等数据结构: 使用 Hash 来生成 key .
Memcached : 分布式一致性 Hash 算法.
文件传输校验: 使用 Hash 算法生成消息摘要, 验证文件是否被篡改.
如果是做 Web 开发, 还必须得掌握 XSS/CSRF/SQL 注入等常见的 Web 攻击技术和和应对方案
4 并发编程
这是一个编程中绕不过的主题, 单个线程的状态变化, 多线程的同步与互斥, 各种各样的锁, 死锁, ThreadLocal , volatile ,CAS...... 总之有点烦人.
扩展开去还有线程池, 各种并发模型如 Actor, Channel 等等.
5OOD/OOP(面向对象的设计 / 编程)
只要使用面向对象编程语言, 就要修炼 OOD 内功, 用 OO 的语言写面向过程的程序实在是一件可悲的事情.
OOD/OOP 的核心就是 "抽象", 什么是抽象? 其实就是摈弃了细节, 找到那些本质不变的部分. 举个例子, Java 中的 List 是对一个可以通过下标顺序访问的集合的抽象, 管你是什么 ArrayList, LinkedList, 都是 List.
有了 "抽象", 就可以针对接口编程, 而不是针对实现编程. 就像一个领导, 说话的层次高, 说出的话比较含糊.
正是由于这个特点, 具体的实现可以替换, 可以扩展, 灵活性很高.
说起来简单, 做起来确很难, 因为这个东西有点 "玄妙", 需要自己去修炼, 去体会哪些 SOLID 原则, 去领悟设计模式背后的思想, 而不是学习招式.
阅读优秀源码是个很好的途径, 看看大牛们是怎么抽象出哪些 "不变" 的部分的.
6 数据库
关系数据库也几乎是每个系统的必备, 即使是 Android 开发也需要利用 sqlite 这样的轻型数据库.
所以程序员要会根据需求来设计表, 掌握基本的 SQL 操作.
深入一点的话, 事务和索引是理解关系数据库的两个重头戏.
需要理解事务的特性和隔离级别, 理解 Undo/Redo 日志的原理.
理解 MVCC 这个常见的并发控制技术.
理解索引的实现原理, 以及在特定数据库如 MySQL 的实现. 查询和索引的关系.
7 函数式编程思想
函数式编程已经诞生很久很久了, 虽然没有成为主流, 但是它的思想却在很多语言中生根, 发芽, 结果.
很多语言都拥抱了函数式编程的思想, JavaScript,Python, Ruby, Scala..... 也包括非常 "保守" 的 Java.
不仅如此, 函数式编程中的 Map 和 Reduce 的思想还在大数据的领域大放异彩.
我估计以后使用函数式编程的机会越来越多, 了解它的思想有极大好处.
函数式编程的基本概念包括: 纯函数, 不变量, 递归, 高阶函数. 高级一点的有 Currying, 惰性求值, 宏 (macro).
8 测试和重构
掌握单元测试已经是程序员的必备技能了, 如果还不会的话, 赶紧去补上吧.
需要注意的是, 一定要让单元测试有这么几个特点:
1. 单元测试是 "白盒测试", 应该覆盖各个分支流程, 异常条件
2. 单元测试面向的是一个单元 ("Unit"), 是 java 中的一个类或者几个类组成的单元.
3. 单元测试运行一定要快!
4. 单元测试一定是可重复执行的
5. 单元测试之间不能有相互依赖, 应该是独立的.
6. 单元测试代码和业务代码同等重要, 要一并维护.
另外还有自动化的功能测试, 性能测试, 都是应该了解, 甚至掌握的技能.
重构也是一大技能, 在保证功能不改变的情况下, 让代码变得更好.
Martin Flower 的书重构中介绍了巨多的重构方法, 我觉得最最常用的是两个:
变量重命名: 用清晰的名称体现代码的意图
提取函数: 将大函数拆分成小函数, 消除重复, 让代码更容易阅读
当然, 重构需要 IDE 的支持, 在这一点上静态类型语言要比动态类型语言表现得更好.
9 版本管理
公司的源码肯定是要纳入版本管理的, 如果你的公司还在通过程序员之间复制的方式来共享代码, 我建议马上跑路.
如今程序员也爱社交, 不会使用 Git/GitHub 简直不好意思和人打招呼.
初学者不要把它想得很复杂, 自己找个教程, 动手做几次, 很快就掌握了.
10 正则表达式
这个不多说, 对文本进行查找, 替换非常有用.
来源: http://zhuanlan.51cto.com/art/201804/569747.htm