Published on

读《Java夜未眠》部分笔记

Authors

编程是我的一大兴趣爱好,写程序让我觉得很开心。就像蔡学镛老师说的:“我承认我很幸运,现在的我同时把程序设计当成茶余饭后的休闲活动、学习的题材,以及赚钱的工作。”

今晚失眠了,想起蔡老师的《Java夜未眠》,翻出来再读一读,做了一些笔记,供自己和程序员朋友们参考。

《Java夜未眠》部分笔记

蔡学镛 台湾台南县人,于1999年获得台湾清华大学计算机硕士学位,曾经担任创新工场首席布道师。 蔡学镛从小开始学习编写程序,至今已经27年,涉猎极广,相关领域有: 编程语言(BASIC、BaseIII+、LIPPER、86汇编语言、C++、Java、C#、VB .net), DSL(领域特定语言)、软件工程、操作系统、虚拟机器等。 蔡学镛担任过华硕集团软件工程师、技术总监、元智大学讲师、美商欧莱礼出版社技术编辑、台湾微软杂志专栏作家、CTO、阿里巴巴集团支付宝架构师、创新工场架构师、银联移动支付首席产品架构师。 著有《Java夜未眠》《编程ING》, 译有《深入浅出设计模式》、《随意搜索》、《超越Java:探讨程式语言的未来(台湾版)》、《Ajax快速上手》、《Java虚拟机器(台湾版)》。

学习,是一条漫长的道路

  • 先深后广
  • 阅读英文技术资料

写程序,好好玩

  • policy tool 安全设定《Java 安全防护》
  • refactoring
  • You’ve got the whole world in your hand

如何进入程序设计的领域

  • 培养兴趣

  • 慎选程序语言

    • REBOL
    • Python
    • Java
      • A Jack of all trades is master of none
      • 学精某种程序语言,然后再学另一个程序语言
  • 使用适当的开发工具

  • 多读好书,少上课

    • 找志同道合的朋友组织“读书会”
  • 加强英文阅读能力

  • 求人之前,先求自己

    • 自己应该尝试先查书、写程序测试、甚至阅读源代码来找答案
  • 多写程序练习

    • 由小到大,由简单到复杂
    • 找一些有趣的题目(比如:计算器、踩地雷、小画家、俄罗斯方块等)
  • 向上延伸、向下延伸、向旁延伸

    • 向上延伸:学习对象导向分析设计、设计模式、重构以及软件工程。让自己具有做大型项目的能力
    • 向下延伸:升入了解内部底层的运作机制,例如数据结构、操作系统原理、计算机组织与结构
    • 向旁延伸:学习不同应用领域的API,例如:多媒体、数据库、分布式运算等
  • 写程序是很有趣的事情,可以把自己的想法付诸实现

  • 每隔半年检阅自己这段时间的进步

职业敏感度

  • 把职业融入生活
  • 培养高度的职业敏感度
    • 让自己暴露再大量相关的信息下

程序员的生涯规划

软件产业的知识经济

  • Know-What 认知性的只是 cognitive knowledge
  • Know-How 进阶技能 advanced skills
  • Know-why 对整个系统的掌握度 System understanding,了解各种知识背后复杂交错的因果关系
  • Care-Why 自发性的创意 self-motivated creativity
  • 时间和努力见证知识经济

偶像崇拜

  • 适当地崇拜优质的偶像,可以激励起自己“有为者亦若是”的精神
  • David Flanagan :《Java in Nutshell》
  • Jonathan Knudsen:《Java密码学》 《Java 2D图形技术》 《乐高可编程积木》
  • Bruce Eckel:《Thinking in java》
  • Elliotte Rusty Harold:《Java Network Programming》《java I/O》《XML Bible》
  • Martin Fowler:《Refactoring》 《UML Distilled》 《Analysis Patterns》
  • Bill Day:JMF Java Media Framework
  • James Gosling
  • Bertrand meyer 《Object oriented software construction,2nd ed》
  • Carl sassenrath rebol
  • charles petzold《code》

学习java

  • java 的原理

  • 学会java 语言 《The Java spacification 》 《inside in java virtual machine》

  • 面相对象的思维 多看相关书 design pattern refactoring 多看java API design 与implementation 多写程序

  • API

  • 开发工具的用法

  • 垃圾回收

    • 改用一个内存管理方式好一点的虚拟机
    • 少制造垃圾,能用数组的就不要用vector,能用Stringbuffer的就不要用String
    • 不再使用的对象要尽早设置为null
  • 变量的种类

    • 根据声明方式,分为7种变量
class MyClass{
	  //class variable 声明在class内,method之外,且用static修饰的变量             
     static int a;
     
     //instance variable 声明在class内,method之外,未用static修饰的变量
     int b;
     
     //method parameter声明在method小括号内的变量
     public static void MyMethod(int c){
          try{
             // local variable 狭义的局部变量 声明在method内的变量
             int d;
             
          }catch(Exception e){
             // exception-handler parameter 声明在catch小括号内的变量  
          }
     }
     
     // constructor parameter 声明在constructor小括号内的变量
     MyClass(int f){
          // local variable 狭义的局部变量 声明在method内的变量
          int[] g = new int[100];
     }
}

  • 根据变量的内存,分为2种变量 heap variable 占用的内存在heap中,包括了 class variable,instance variable,array compnent,即上一程序的a b g[0],这类变量会自动被JVM初始化成默认值 stack variable 通常称为广义的局部变量 pan-local variable,占用的内存在stack中,这类变量包括了狭义的局部变量,exception-handler parameter,method parameter,constructor parameter 即上面程序的cdef,狭义的局部变量不会被JVM初始化默认值,使用者必须自行初始化该变量,但是 parameter类的变量会被JVM初始化成传入的值。

  • 根据使用方式为变量分类 class variable instance variable 广义的局部变量 包含上例的cdef 数组视为对象,array compenent 视为对象的instance variable