来自某位大佬:
内功=算法+数据结构+编译原理+操作系统原理+软件工程+英文
十足的自信心+强烈的求知欲+对Programming&&C&&CPP的执着+百折不挠的钻研精神+数据结构&算法基础+操作系统基础+C&CPP语法基础
恐惧,崇拜,诋毁都源于无知。
不要拒绝承担重担
承担多大的担子,就会有多大的价值。主席他老人家说过:人有多大胆,地有多大产。只有敢于承担重担的人,才可以委以重任。而且,更多的历练会锻炼你快速的成长,丰富的人生阅历将是一笔无比的财富。
第一种武器:开发工具
至少熟练掌握两到三种开发工具的使用,这是程序员的立身之本,其中C/C++和JAVA是我重点推荐的开发工具,C/C++以其高效率和高度的灵活性成为
开发工具中的利器,很多系统级的软件还是用C/C++编写。而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在,而本人对SUN公司的“网络即
计算机”的概念相当欣赏,并相信JAVA即其相关的技术集JAVA
One会成为未来的主流开发工具之一。其次,如果能掌握一种简便的可视化开发工具,VB,PowerBuilder,Delphi,C++
Builder,则更好,这些开发工具减小了开发难度,并能够强化程序员对象模型的概念。另外,需要掌握基本的脚本语言,如shell,perl等,至少
能读懂这些脚本代码。
第二种武器:数据库
为什么数据库是如此重要?很多应用程序都是以数据库的数据为中心,而数据库的产品也有不少,其中关系型数据库仍是主流形式,所以程序员至少熟练掌握一两种
数据库,对关系型数据库的关键元素要非常清楚,要熟练掌握SQL的基本语法。虽然很多数据库产品提供了可视化的数据库管理工具,但SQL是基础,是通用的
数据库操作方法。如果没有机会接触商业数据库系统,可以使用免费的数据库产品是一个不错的选择,如mySQL, Postgres等。
第三种武器:操作系统
当前主流的操作系统是Windows,Linux/Unix,熟练地使用这些操作系统是必须的,但只有这些还远远不够。要想成为一个真正的编程高手,需要
深入了解操作系统,了解它的内存管理机制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。Linux作为开发源码的操作系统,是一个很好的学
习平台,Linux几乎具备了所有现代操作系统的特征。虽然Windows系统的内核实现机制的资料较少,但通过互联网还是能获取不少资料。只有对操作系
统有一定的了解后,你会发现自己上了一个新的台阶。
第四种武器:网络协议TCP/IP
在互联网如此普及的今天,如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握,就需要迅速补上这一课,网络技术已改变了软件运行的模式,从最
早的客户/服务器结构,到今天的WEB
Services,再到未来的网格计算,这一切都离不开以TCP/IP协议栈为基础的网络协议支持,所以,深入掌握TCP/IP协议是非常必要的。至少,
你需要了解ISO七层协议模型,IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。
第五种武器COM/CORBA/XML/WEB Services
随着技术的发展,软件与网络的无缝结合是必然趋势,软件系统的位置无关性是未来计算模式的重要特征之一,DCOM/CORBA是当前两大主流的分布计算的
中间件平台,DCOM是微软COM(组件对象模型)的扩展,而CORBA是OMG支持的规范。程序员需要做的不仅仅是利用商业的开发平台来开发软件,而是
要理解这些技术的初衷,即为什么需要这项技术,如果你能理解了这一点,再回头看这些技术的具体实现,就如庖丁解牛,迎刃而解。
XML/WebServices重要性不言而喻,XML以其结构化的表示方法和超强的表达能力被喻为互联网上的“世界语”,是分布计算的基石之一。
第六种武器:软件工程与CMM
程序人生成长发展中的一些感悟
1.要成长,有人带,很重要。
一个人能力与努力非常重要,但要更快地走向成功,少走弯路,就必须学会借助外界或他人的力量。即使给你足够的书和教程,给你足够的时间,也未必可以修炼成
才。需要环境,需要实践,更需要团队的沟通和相互学习,一个人不可能学会一切,即使可以也会需要很多年的时间,最终还不知道是否正确。正所谓,名人指教,
高人指点,不无道理,因为前人的经验教训是用多年的时间和精力换来的,而你得到这个道理,却只需瞬间,无形中减少了成长的成本。
想进步,有人带,这就是现实。孔子曰,三人行,必有吾师。
交换思想,会令你了解的更多;有人带,会使你成长的更快!
2.广结佛缘
知识面的狭窄会导致思路的狭窄,想法简单。做事情的时候处理问题的办法相对要少。对一个技术性的问题而言,如果做得项目多了,类型多了,相对来说遇到一个
问题,就会知道该用什么样子的方式解决最好,哪种途径最有效。而广义的讲,在社会上,你接触社会面广,人脉资源丰富,相应的做事的途径就会多,成功的机率
就会大,这是一个普通的不能再普通的道理了。所以,可以提醒一些同行的xdjm们,平时里不要只是低头写你的代码,多接触一些新的知识或技术,新事物会对
你设计系统提供思路或启发。多了解社会,多和人沟通,多培养一些人脉,多给自己一些机会,你会觉得这个世界很美好。
3.目标决定过程
先认清“正确的结果”,根据正确的结果去设计你的过程。你选择什么样的目标,就会有什么样的人生。当一个人具有明确目标,会对有助于实现目标的蛛丝马迹都
特别敏感,做事情相应也就会很有目的性,而不是稀里糊涂。
所以,就容易到达自己的目的。如果没有目标,就算是天上真有神仙,如果你不能明确地说明自己想要什么,神仙也不知道该给你什么。
4。技术和管理
作了这么多年的技术,有时候会发现一些所谓的技术不过就是一些控件或类库的使用(当然不是全部是),有时候我们所做的工作还不能算是真正的“创造”,充其
量是一种“制造”。也经常在论坛看到争论到底是技术重要还是管理重要,这其实体现了一部分朋友的迷茫,作过多年的程序员都会想向上发展,其实并没有错,做
技术没有出头之处,并不代表没有其他的潜力或优势。况且国内盛行“35是个坎”的言论。如果从一个人的职业规划和社会价值角度讲,人应该争取为社会创造更
大的价值。一段代码创造的价值远不如一个商业流程或商品设计创造的价值大,正如:盖楼的工人师傅和设计楼的设计师,没有谁重要不重要的问题。而是一种人生
价值观的问题。但前提是并不是所有的工人都可以成长为设计师的,要根据自己的实际情况和职业愿望所决定。
所以,对于一些有潜力,有志向这方面发展的朋友,而又想体现更大的自身价值和优势,可以尽早计划,制定目标,立即行动,希望能挖掘一下自己各方面的潜力。
我个人也希望能在项目管理或系分方面有所进步,但暂时我还不打算放弃写代码,因为创作源于生活,离开了生活创作便变得空洞,感觉没写过代码的人管理项目或
设计系统会变的有点像纸上谈兵,空中楼阁。
5.不要拒绝承担工作重担
承担多大的担子,就会有多大的价值。主席他老人家说过:人有多大胆,地有多大产。只有敢于承担重担的人,才可以委以重任。而且,更多的历练会锻炼你快速的成长,丰富的人生阅历将是一笔无比的财富。
来吧,让更多的工作来的更猛烈些吧!
6.用心做好现在的每一件事
1)你已经认为C++和汇编语言都是很简单的语言,并能够自如地运用;
2)你能够在30分钟之内想到正确的五子棋AI算法设计思路和方向;
3)你完全理解STL为什么这么重要;
4)你能够独立地解决所有的编译与链接问题,哪怕你从来没有遇到的问题,你也不需要询问任何人;
5)英文网站是你的首要信息来源;
6)能够读懂英语写成的国际标准,比如NTFS磁盘格式标准。
7)你经常站在集合论的角度思考算法问题;
8)能够理解一个简单的驱动程序,能够理解一个简单3D交互程序;
9)你能够认识到线性代数和概率论在实际编程工作中的极端重要性;
10)你完全理解COM的设计思想,尤其能够 理解COM为什么要设计成这样;
11)当我说到虚函数的重要作用时,你不会急着去找书来翻;
12)你能够说出C++为什么比其他语言优秀的理由
C++只是语言.真正灵魂是设计.和算法.
其实程序设计语言是一种工具,大家千万别陷进去。
C++只不过是一种语言,一种工具是用来显示你的编程思想,你对问题的理解能力
如果有一天,由于实际应用的体会领悟或者需要,你觉得C++的标准还有必要再补充一下或者修改一下,那么你就已经超越了C++这种语言本身的范畴,说精通C++也不为过了
没干过C,只针对C++:
1、要很熟悉C++的内存机制。只有了解了这个以后,其它的很多问题才能解决,比如,开一个缓存new时,要指定大小,为什么delete不需要。堆和栈有什么区别,分别在什么时候用比较合适。
2、要有程序运行的时间和空间效率意识,比如加载整个硬盘的文件,大概需要多少内存,10M?100M?1G?各自的处理方式有着本质的区别。缩略显示整个硬盘的图片,如果每次单击滚动条时,要等一分钟,你认为用户能接受吗?
3、要有很强搜索资料能力。比如在程序启动时,要自动发个Email,怎么做?要写个搜索程序,有哪些算法对大批量数据比较合适?
4、要熟悉一种通用库的使用,比如MFC,STL,不一定要很精通,知道照葫芦画瓢就行,要用的时候可以查手册。
5、熟悉一种工具的使用,比如Visual Studio;
6、熟悉动态库和静态库的使用。
什么叫精通C/C++
It is better to have the ability of fast learning