程序员如何学习一门新的编程语言

很多程序员在学习一门新的编程语言时往往会走两种路子:

  • 1.粗粗看看语法,就撸起袖子开干,边查Google边学习
  • 2.花很多时间完整地把整个语言学习一遍,做到胸有成竹,然后再开始做实际工作

第一种学得太少,第二种学得太多,都不合适,其实学习一个编程语言达到能够入流的程度并不需要太高深的东西,平时需要用到的大都是基础知识,集中一周业余时间学习一下完全能达到掌握的目的。

其实写程序不怕完全不会,最怕一知半解的去攒解决方案。因为你完全不会,就自然会去认真查书学习,如果学习能力好的话,写出来的代码质量不会差。而一知半解,自己动手土法炼钢,那搞出来的基本上都是废铜烂铁。

因此,即使时间再紧张,使用新编程语言进行开发之前,下面的这些内容也是必须首先完整了解一遍的。掌握这些内容之后进入实际开发,即使有问题,也基本不会伤及项目大体。而开发者本人则可以安步当车,慢慢在实践中提高自己。

1. 了解该语言的

  • 基本数据类型
  • 基本语法和流程控制,判断/分支/循环等
  • 主要数学运算符
  • print函数的使用

达到能够编写数学习题的程度.

2. 掌握

  • 数组和其他集合类的使用
  • 有基础的话可以理解一下泛型,如果理解不了也问题不大,后面可以补;

3. 简单字符串处理

  • 所谓简单,就是Regex和Parser以下的内容,什么查找替换,截断去字串之类的。不过这个阶段有一个难点,就是字符编码问题。如果理解不了,可以先跳过,否则的话最好在这时候把这个问题搞定,免留后患;

4. 基本面向对象或者函数式编程的特征

无非是什么

  • 继承、
  • 多态、
  • Lambda函数之类的,

如果有经验的话很快就明白了;

5. 异常、错误处理、断言、日志和调试支持,对单元测试的支持

你不一定要用TDD,但是在这个时候应该掌握在这个语言里做TDD的基本技能;

6. 程序代码和可执行代码的

  • 组织机制
  • 运行时模块加载
  • 符号查找机制

这是初学时的一个难点,因为大部分书都不太注意介绍这个极为重要的内容;

7. 基本输入输出和文件处理,输入输出流类的组织

这通常是比较繁琐的一部分,可以提纲挈领学一下,搞清楚概念,用到的时候查就是了。到这个阶段可以写大部分控制台应用了;

8. 该语言如何进行callback方法调用,如何支持事件驱动编程模型。

在现代编程环境下,这个问题是涉及开发思想的一个核心问题,几乎每种语言在这里都会用足功夫,

  • .NET的delegate,
  • Java的anonymous inner class,
  • Java7的closure,
    C++ OX的 tr1::function/bind,

五花八门。如果能彻底理解这个问题,不但程序就不至于写得太走样,而且对该语言的设计思路也能有比较好的认识;

9. 序列化和反序列化

掌握一下缺省的机制就可以了;

10. 动态编程,反射和元数据编程,数据和程序之间的相互转化机制,运行时编译和执行的机制,

有抱负的开发者在这块可以多下些功夫,能够使你对语言的认识高出一个层面;

11. 如果有必要

可了解一下线程、并发和异步调用机制,主要是为了读懂别人的代码,如果自己要写这类代码,必须专门花时间严肃认真系统地学习,严禁半桶水上阵;

12. 如果有必要

可在这时研究regex和XML处理问题,如无必要可跳过;

13. 如果有必要

可研究一下该语言对于泛型的支持,不必花太多时间,只要能使用现成的泛型集合和泛型函数就可以了,可在以后闲暇时抽时间系统学习。
需要注意的是,泛型技术跟多线程技术一样,用不好就成为万恶之源,必须系统学习,谨慎使用,否则不如不学不用;

14. 如果还有时间

最好咨询一下有经验的人,看看这个语言较常用的特色features是什么,如果之前没学过,应当补一下。比如

  • Ruby的block interator,
  • Java的dynamic proxy,
  • C# 3的LINQ和extension method。

没时间的话,我认为也可以边做边学,没有大问题。

15. 在工作的闲暇时间,可以着重考察两个问题,

  • 第一,这个语言有哪些惯用法和模式,
  • 第二,这个语言的编译/解释执行机制。

至此语言的基本部分就可以说掌握了,之后是做数据库、网络还是做图形,可以根据具体需求去搞,找相应的成熟框架或库,边做边学,加深理解。
掌握了以上的内容,就给练武术打好了基本功,虽然不见得有多优秀,但是肯定是根正苗红,将来不必绕大弯子。就算是临时使用的语言,把上面这个提纲精简一下,只看重体字的部分,大致能在几天到一周内搞定,不算是太耗时,而且写出来的代码不会太不靠谱。

以上提纲未设及内存模型。对于C/C++,这个问题很重要,要放在显著位置来考虑,但对于其他语言,这个问题被透明化了,除非你要做hardcore项目,否则不必太关注。

posted @ 2017-04-28 15:45  乔高建  阅读(3757)  评论(1编辑  收藏  举报