摘要:《程序员的呐喊》一文,讲了三个部分的内容,笔者重点阅读的是面试的章节,以及总结,摘录重点之处。
1 该书的后记翻译部分,言简意赅,但是又突出了个性,说出了程序员该有的态度
- 软件开发的方式多种多样,不存在谁好谁坏,但是他们互相都看不起 ——笔者注:哈哈哈,这个是程序员的通病,个个都很傲娇。
- 好的程序员之所以出色是因为熟能生巧 ——笔者注:程序员需要多写代码,写得越多越出色。
- 只要你愿意,随时都可以学习新语言 ——笔者注:事情不是因为难而不做。而是不做就觉得很难。
- 如果你想当经理,那你很可能不会是个好经理 ——笔者注:当经验达到一定程度,也就顺理成章了。
- Lisp很难掌握,但它是唯一能让我快乐的语言
- Emacs很难掌握,但却是受益终身的投资
- 离开舒适区,是不是学点新东西为自己写点东西,只有这样你才知道那是不是对的 ——笔者注:人需要一直保持警觉,贪念安逸是退休后的生活,我们还年轻,持续纠偏,或许这也是我写博客的原因了,说出自己知道的,挖掘自己不知道的,时刻保持一个空杯心态。
- 多笑一点,这很健康,也让人感觉良好 ——笔者注:开心了,笑一笑,不开心,过一会儿,再笑,爱笑的人运气都不差。
- 记得自嘲,不过不要再公开场合大声自嘲,也不要忘了解释 ——笔者注:拥有乐观的心态,肯定自己独特的一面,也要反省自己技不如人的一面。
2 作者写到了如何面试,准备很重要,所谓不打无准备之战,要么不战,要战必胜
2.1 非技术部分
2.1.1 热身
长期热身:面试前复习1~2星期,好好读一本讲数据结构和算法的书,或者《算法导论》,至少能够识别问题属于哪一个类型,或者找一个朋友当面试官,充分热身才有最出色的表现。
短期热身:面试前一晚一定要休息好。
2.1.2 心理准备
保持谦逊、开明、专注的态度,要是卡住了,不要害怕问问题,有些面试官通常也乐意帮你清除一些障碍,尽力去完整的解答它。有时候可以和面试官确认自己是不是在正确的方向上。
2.2 技术面试
2.2.1 问:什么是算法复杂度,大O是什么?
答:算法复杂度指两个方面,时间复杂度(执行时间长短)和空间复杂度(度量算法所需存储空间的大小)。大O是时间复杂度中执行次数的一种表示方式。
扩展:时间复杂度通常用T(n)表示,n指模块规模,由于单次运算的时间与执行的机器有关,但在同一个机器上,单次运算的执行时间是固定的,因此T(n)与执行次数成正比。使用过程中更多的使用O(n)来表达,n指执行次数,一个算法的执行时间还与目标样本和运算的参数决定,因此O(n),一般用三个值表示,最小时间复杂度,平均时间复杂度,最大时间复杂度。一般情况下,平均时间复杂度具备很好的描述算法优劣的标准。
2.2.2 问:什么是哈希表
答:散列表Hash table也叫做哈希表。通过关键码值映射到表中一个位置来访问记录。
2.2.3 问:构造一棵树,如何便利,了解前序、中序、后序遍历,怎么操作二叉树、n叉树、trie树
答:树是事物经典的结构,几乎无处不在,树表达的哲学思想就是分治,比如:任何一个java对象就是一棵树。
如果将树中节点的各子树堪称是从左到右有次序的,称作有序树,否则称作无序数。
每个节点的度均不超过2的有序树,称作二叉树,实际也用的比较多。
图
高级算法
2.3 其他数据结构
著名的NP问题,如旅行商问题和背包问题
操作系统:进程、线程、并发、锁的概念、互斥锁、信号量、死锁、活锁、怎么避免他们、进程需要哪些资源、线程需要哪些资源、上下文切换怎么进行、操作系统和底层硬件是怎么触发上下文切换的等,推荐《Java并发编程》,道格.李
附录:
《程序员的呐喊》,美 Steve Yegge著,徐旭铭译,人民邮电出版社
《数据结构与算法(JAVA语言版)》