写给想当程序员的朋友

(一) 文章由来及个人经历

我是一名计算机专业的本科毕业生,毕业已经1年多了。毕业后从事的是软件编程工作,经常有其他专业的朋友想从事软件编程工作,向我请教如何,因为我自觉涉行不深,不敢信口开河,无奈朋友信任,我不得不郑重考虑一下这个问题了,来帮助朋友选择和回报朋友的信任。

这也就是此文的由来。

还是先谈谈我个人的经历吧。(是不是有点俗套,但我觉得了解我的经历,有助于理解我话的含义;我一向认为不了解古龙的生活经历的,不会真正读懂古龙的作品和古龙笔下的英雄的)我本科就读于南方一所著名的高校(因为自己的不成气,愧谈母校名谓),学的就是计算机专业。上本科时,几乎没有认真的听完一门专业课程,上课看报纸睡大觉,下课看录像看小说看球赛,临考抱佛脚,每次考试和课程设计都是蒙混过关。(于之相对是,我选修的工商管理和经济贸易方面的课到是听得不亦乐乎,考的分数颇高,也许这才是我的真正兴趣所在。)

总而言之,大学是混过来了,对专业的理解和掌握程度,应该没有达到毕业要求的合格水平。(也很后悔,但是有什么用呢,当时不知道珍惜;如果上天再给我一次机会的话,我一定会抓住,多看点美国大片少看点港片;现在,重回校园是我的一大理想)但是大学的学习使我有了一个简单的知识框架(总算学费没白交),我对一个朋友这样形容过我的这个知识框架,“它不是钢筋铸的,是稻草扎的”,哈哈哈,不要笑,真的,我敢说很多本科毕业的朋友的本专业的知识框架也只不过是“稻草扎的”。直到现在,我一直觉得自己的基础知识还是很薄弱,一直想抓点时间,把基础书本好好的温习一下。(此项任务正在计划和实施中) 毕业后,分配到某研究所工作。当领导让我选择自己以后的工作方向时,我毫不犹豫的选择了软件(也不知道到底是对还是错,但我决不后悔)。此研究所主要是以硬件为核心搞通信控制设备的研发生产;软件是辅助,所以也不受什么重视,很多搞软件的人都跳槽走了,留下来的大都是一些已经废掉和行将废掉的“伪/萎”程序员(名副其实的“软件人员”)。在这里感觉不到什么高紧张和高技术程度的研究和开发;软件开发的技术含量极低,以致于大部分人只有半年的学习和开发经验,以后都是这些知识和经验的重复利用。(我问过其他到研究所工作的同学,他们说都一样,呜呼,我们的国防科研开发呀)对于软件的开发,领导的意志和老掉牙的经验在新课题的技术采用和开发中起了决定性作用,没有明确的需求,没有明确的开发计划和进度,大家在一天一天一周一周的浪费着宝贵的时间,最后开发出来的

东西修来改去,直至它变成垃圾。 我越来越认识到一点,要么象那些废人一样废掉,要么自己去努力寻求出路,反正别指望从工作中得到什么高明的经验了(教训倒也许有)。期间发生了一些感情上的纠纷,严重的影响了学习计划和效果,直到现在浮躁的心仍然有些浮躁。 期间,我读了一些书,看了一些文章,编过一些小例程,搞了一些没有什么技术含量的开发工作,也和一些前辈和高手们谈过聊过。 我一直在思考几个问题;如何学习软件开发?如何搞软件开发,国外的软件开发到底其秘诀在何处?为何我们的软件业一直在低水平徘徊?我们难道真的离了Microsoft就活不了?我们的程序员到底在浪费时间干些什么?软件开发到底是如何分类的?我们如何走自己的民族软件之路?

我想了很久,一些想通了,一些还在想。但我知道有一点是肯定的,那就是我们一定要靠我们自己走出自己的软件之路!跟在别人屁股后面永远受制于人!

好了,关于经历和牢骚就先写这些吧,该进入我们的正题了。

(二) 你适合当程序员吗,你知道编程序是怎么回事吗?

1、 程序员意味着要编程序。(如果你仅仅想得到一份高薪水的工作,喝喝咖啡就等老板发薪水,我奉劝你还是另找一份更合适的工作,譬如练摊,真的,兄弟,这份工作不适合你)

2、你是学文的还是学理的,编程序也许需要浪漫,但更需要逻辑和严谨。(说坦白点就是,在你没有找到乐趣以前,它很枯燥)

3、你有对新技术追求的热情吗?你有刨根问底的探索精神吗?(热情绝对是最重要的!你仔细思考一下自己的性格适合当程序员吗?)

4、当程序员决不是什么好差事,时刻需要学习,需要思考。(直到你成为那个可以引导别人去学习和思考的人,你才可以偷偷的嘿嘿笑,又一群傻蛋)

5、程序员的未来很迷茫。(但我认为关键看你自己!我希望你是一个有追求的人,不仅仅是混碗饭吃。因为真正的乐趣在于创造;如果你能改变软件业的历史,那才是英雄;不想成为Bill Gates,不想成为Dennis Ritchie和Bjarne Stroustrup,我会说你没有追求。有个关于程序员未来的笑话,也许你还没听过,你该听一听,摘抄如下:

一个程序员对自己的未来很迷茫,于是去问上帝。

“万能的上帝呀,请你告诉我,我的未来会怎样?”

上帝说“我的孩子,你去问Lippman,他现在领导的程序员的队伍可能是地球上最大的” 于是他去问Lippman。

Lippman说“程序员的未来就是驾驭程序员”

这个程序员对这个未来不满意,于是他又去问上帝。

“万能的上帝呀,请你告诉我,我的未来会怎样?”

上帝说“我的孩子,你去问Gates,他现在所拥有的财产可能是地球上最多的”

于是他去问Gates。

Gates说“程序员的未来就是榨取程序员”

这个程序员对这个未来不满意,于是他又去问上帝。

“万能的上帝呀,请你告诉我,我的未来会怎样?”

上帝说“我的孩子,你去问侯捷,他写的计算机书的读者可能是地球上最多的”

于是他去问侯捷。

侯捷说“程序员的未来就是诱惑程序员”

这个程序员对这个未来不满意,于是他又去问上帝。

“万能的上帝呀,请你告诉我,我的未来会怎样?”

上帝摇摇头“唉,我的孩子,你还是别当程序员了”

6、当程序员还是很有乐趣的。(当你学到新知识时,当你有新的思想见解时,当你有新的产品问世时,和知己探讨你的成果时…我问你,觉得这些是乐趣吗?)

7、当程序员不易也不难。(世间事有难易乎?为之…;不为…。你有决心和信心吗?)

8、你真的要当程序员?是你自己的想法?

9、你舍得花钱买书吗?(读好书绝对是学习编程的最佳捷径。你一定会说,现在电脑书籍真T.M.D贵,没法子,谁让知识和技术在人家的脑袋,在人家的书里呢;等你写书时可以把价格定低一点,记着还有好多没钱但想买书的兄弟很困难呀。要舍得买书,买好书,不好的的书不如不读,其害大于其益,关于买什么书,你可以问高手或看候捷的书评;准备一个小本子记录你想买的书的名字,逛书店时看看,如果好就买下,记住要读,别光买不看。)

10、我告诉你,程序就是:任何有目的的、预想好的动作序列,它是一种软件。

11、编程序就是编写程序。

12、你想好了吗?(如果你想好了还是决定要当程序员,可以继续往下读;否则,你可以继续寻找别的出路了。)


(三) 一个程序员应该具备的基础知识和概念

1、计算机是有什么组成的,CPU是什么东西,其工作原理是什么。(对于这些以及下面将要提到的概念我不会告诉你什么答案,你可以看相应的教材,关于教材我会在下一部分详述,记住理解最重要!)

2、机器语言和微指令集的概念。

3、程序的概念。

4、汇编语言是低级语言但不是机器语言。

5、高级语言主要有那些?(C,C++,Basic,Pascal,Fortran,C#,Java等等;如果你是中国软件业的英雄,你也写一门语言,最好不用英语)

6、编译程序和解释程序的概念和其原理。(编译器是高手和专家编写的)

7、HTML、XML等是标识性语言。

8、Prolog是人工智能语言。

9、操作系统OS的概念和原理。(Windows,UNIX,Linux,等等都是OS,还有一些实时OS,嵌入OS,编这些的绝对是高手)

10、Windows编程说白了就是Windows API的调用。(中国的程序员很多只是会编Windows程序,用的是VB,我的建议是这些程序员顶多只是低级编码员,我称其是coder)

11、VC++、VB、BC、BCB、Delphi、VF等都只是编程的工具和环境,不是编程语言。

12、面向结构的设计概念。

13、面向对象的概念。(好好理解,兄弟,这个东西还是很重要的)

14、软件工程的概念和原理。(如果你想当老总就需要好好研究了,系统分析员比编码员要高一个等级,薪水也高哟)

15、数据库的概念。(要熟悉一些著名的数据库系统和语言的名字,如Orcle,SQL Server,DB2,DyBase等)

16、了解网络概念。

17、了解多媒体概念。

18、熟悉和掌握数据结构和基本算法。

19、是不是要求太高了,别着急慢慢来,进步在不知不觉之中。(一旦开始学习,一个月以后你就会有一个基本的概念;两个月以后你就会感觉自己有了全面的基础知识;当你知道编程序是怎么回事时,说明你已经入门了。也有很多人编了很多年程序还没有入门呢,你不会希望自己步其后尘吧。要有信心和耐心。沉不住气怎么能成大事?!)


(四) 教材推荐

――推荐的教材主要还是针对概念来的,最好选用名校的教学用书。

1、《计算机组成原理》(熟悉)

2、《数据结构》(掌握)

3、《操作系统》(了解->熟悉)

4、《The C language》(掌握)

5、《编译原理》(了解原理)

6、《汇编语言》(了解)

7、《计算机网络》(了解)

8、《软件工程》(了解)

9、《关系数据库》(熟悉)

10、《The C++Languege 》(掌握)

11、《面向对象设计》(掌握;结合C++学习)


(五)一些经验和体会

1、真正的程序员用C++;(一位专家说的)

2、动手去编程序;

3、动脑去思考;

4、要有良好的编程风格;

5、读书,读好书,尽量读原版书!(我反复强调这一点,读书要有选择,坚持读好书,名家出的经典书,不要浪费实践在一些粗制滥造的书上面;坚持博览群书)

6、有自己的学习计划;

7、总结自己的经验教训;(准备一个笔记本,记录错误和心得)

8、不要怕学新东西;

9、要有软件工程的思想;

10、善于发现问题,然后去寻找答案;

11、向高手请教;(要虚心直到你成为高手)

12、和同行交流;(不善于交流肯定不行)

13、懂得软件的实质,不要被千变万化的表象所迷惑;

14、真正要学习用的是编程语言和方法,不是什么库,什么类,什么工具;(学用那些什么库都比较简单,但光会这些库,我觉得还远远不够)

15、学习Wiodows编程主要是学习Windows OS和Win32 API;

16、有空了解一下嵌入式开发;

17、有空了解一下PDA软件开发;

18、了解一下.NET框架和C#语言,也许它是你新的衣食父母;

19、要有耐心,不要作浮躁的人;

20、对程序加注释,并保留你的老程序;

21、学到的东西越多,了解的越多,你就越接近专家;

22、要有信心成为一个优秀的程序员。


(六)一些好书的推荐

1、《The C Programming language》 (Keinighan & Dennis Ritchie 1988)

2、《The C++ Programming Languague》(Bjarne Stroustrup 1997)

3、《Inside The C++ Object Model》 (lippmans)

4、《Effective C++》 (同上)

5、《More Effective C++》 (同上)

6、《Exceptional c++》

7、《C++面向对象高效编程》

8、《设计模式》

9、《Thinking In C++》

10、《The Standard C++ Bible》(一般推荐)

11、《The Art of Computer Programming 》

12、《Programming Windows》 (Charles Petzold)

13、《VC++5.0技术内幕》

14、《MFC 深入浅出》

15、《软件需求》

16、《Advanced Windows》

17、《C++ primer》

18、《Win32程序员参考手册》

19、《用TCP/IP进行网际互连》

20、《COM 本质论》

(七)学习计划

――这个学习计划是我个人定的,也共享给大家参考一下,共同进步吧。

1、《计算机组成原理》

2、《操作系统》

3、《数据结构》

4、《汇编语言》

5、《 C 》

6、《 C++ 》

7、《VC 技术内幕》

8、《Programming Windows》

9、《深入浅出MFC》

10、《Advanced Windows》

11、《Inside The C++ Object Model》

12、《Thinking in C++》

13、《Effective C++》

14、数据库

15、网络

16、嵌入式OS和编程

17、硬件单片机

18、.NET和C#

19、软件工程

20、UNIX和Linux


(八)后记

一年来浪费了大量的时间去摸索,去思考,走了很多的弯路,直到现在我还觉得自己是个编程的门外汉。我把我的一些体会和想法说出来(当然,很多都不一定正确,欢迎大家指正和讨论),也许对一些想加入程序员行列的朋友有一些建议和帮助。希望能帮助这些朋友顺利走上编程之路,成为高手。

如果真能如此,我也就很高兴了。欢迎有兴趣的朋友给我发E_mail

(sjpsky@163.net);我这个人有两大业余爱好,其一就是读武侠小说,其二就是结交英雄侠士。

后记:此文我用analyster的名字登录,发表在“csdn-程序人生”上了,有很多网友看了,回了,还收到几个网友发来邮件,和我探讨,我很感谢大家对我的信任和鼓励。 我要说明的就是我的这篇小文,主要是想给“一些想成为程序员”的朋友一些建议,帮他们寻找一条自我培训的捷径,(其实世界上没有什么捷径的,我觉得一切都在于悟性,师傅领进门,修行在个人,譬如我就修行不够)少象我一样作大量的无用功。还有,主要就是一个程序员应该具备的基本功(个人看法),有人称其为“内功”,我觉得很对。没有扎实的基本功,我们如何能够做到游刃有余的编写高质量高性能的优秀程序呢?

让我们共同努力,振兴我们的民族软件业!

第1 章 MagicARM2410 实验箱硬件结构 1.1 功能特点...............................6 1.1.1 硬件资源.......................6 1.1.2 软件资源.......................7 1.1.3 可选硬件.......................8 1.2 S3C2410A 芯片简介 ............8 1.3 硬件原理............................. 11 1.3.1 DeviceARM2410核心板........ 11 1.3.2 实验箱主板....................................24 1.3.3 构建ARM7 教学实验开发平台...45 1.4 硬件结构................................................46 1.4.1 跳线器说明....................................47 1.4.2 连接器说明....................................50 1.5 硬件资源分配情况................................51 1.6 温馨提示................................................53 第2 章 基础实验................................54 2.1 ADS 1.2 集成开发环境练习 .................54 2.2 汇编指令实验1.....................................59 2.3 汇编指令实验2.....................................62 2.4 汇编指令实验3.....................................65 2.5 ARM 处理器工作模式实验 ..................68 2.6 C 语言程序实验 ....................................72 2.7 C 语言调用汇编程序实验 ....................74 2.8 GPIO 输出控制实验.............................76 2.9 GPIO 输入实验.....................................82 2.10 外部中断实验........................................85 2.11 UART 通讯实验....................................90 2.12 I 2 C 接口实验..................................................95 2.13 定时器实验...................................................104 2.14 PWM DAC 实验...........................................107 2.15 ADC实验..................................................... 111 2.16 RTC 实验...................................................... 114 2.17 步进电机控制实验.......................................120 2.18 直流电机控制实验.......................................123 第3 章 基于µC/OS-II 基础实验 ..............127 3.1 µ C/OS-II移植实验.......................................127 3.2 蜂鸣器实验...................................................136 3.3 串行通信实验...............................................140 3.4 图形液晶控制实验.......................................144 3.5 Modbus RTU 主从通讯实验 ......................147 第4 章 构建嵌入式Linux 开发平台.......................................159 4.1 基础知识....................................159 4.1.1 交叉编译..................................159 4.1.2 宿主机要求................................159 4.2 构建交叉开发环境...............................160 4.2.1 安装交叉编译器...........................160 4.2.2 安装ARM Linux 内核.................161 4.2.3 安装NFS 根文件系统.................162 4.3 构建嵌入式Linux 目标平台 ...............166 4.3.1 相关文件.......................................166 4.3.2 下载Bootloader ............................168 4.3.3 下载Linux 内核和文件系统.......168 4.3.4 启动Linux 操作系统...................170 4.4 Linux 启动参数的设定方法 ................171 4.4.1 ZLG/BOOT 的运行过程..............171 4.4.2 Linux 启动参数的含义 ................172 4.4.3 Linux 启动参数文件的制作 ........173 第5 章 Linux 应用程序编写............175 5.1 HelloWorld 程序实验...........................175 5.2 Linux 定时器实验 ................................178 5.3 多进程实验...........................................180 5.4 多线程实验...........................................183 5.5 文件和目录操作实验...........................187 5.6 UDP 实验..............................................189 5.7 TCP 实验..............................................194 5.8 Webserver 实验 .....................................200 第6 章 Linux 高级实验....................205 6.1 Linux 内核编译实验 ............................205 6.2 Linux 根文件系统实验 ........................206 6.3 CAT1025 读/写实验.............................207 6.4 ZLG7290 键盘读取 ..............................213 6.5 USB-E 2 PROM 编程器实验 ..................218 6.6 SD/MMC卡实验 ..................................230 6.7 触摸屏实验...........................................235 6.8 PCMCIA 接口CF卡实验....................239 6.9 IDE 硬盘实验.......................................245 6.10 USB 主机驱动编译与加载实验..........250 6.11 U 盘驱动程序编译与使用实验...........253 6.12 USB 键盘与鼠标应程序实验..............256 6.13 FrameBuffer模块应用实验.................261 6.14 video4linux 模块应用实验...................268 6.15 USB 摄像头实验..................................274 6.16 无线网络实验.......................................280 6.17 CAN接收实验.....................................284 6.18 CAN发送实验.....................................292 6.19 CAN通信参数设置实验.....................294 6.20 busybox 移植实验 ................................298 6.21 boa 移植实验........................................299 6.22 Madplay 移植实验.............................301 第7 章 嵌入式Linux 驱动开发....305 7.1 Linux 驱动编写概述 .........................305 7.1.1 设备号........................................305 7.1.2 文件层接口................................305 7.1.3 驱动层接口................................307 7.1.4 中断............................................308 7.1.5 I/O 操作.....................................310 7.1.6 设备注册和注销........................ 311 7.1.7 模块化........................................312 7.1.8 初始化........................................313 7.1.9 编译............................................313 7.2 Devfs 驱动程序编写.........................314 7.2.1 设备的注册和注销....................315 7.2.2 加载驱动....................................316 7.3 LED 驱动程序...................................316 7.3.1 LED 驱动程序编写...................316 7.3.2 LED 驱动测试程序...................321 7.4 按键驱动程序....................................323 7.4.1 按键驱动程序编写....................323 7.4.2 按键驱动测试程序....................328 第8 章 嵌入式图形用户界面-Qt/Embedded .....331 8.1 Qt 介绍.........................................331 8.1.1 全面的Qt............................331 8.1.2 跨平台的Qt.........................331 8.1.3 深入了解Qt........................332 8.2 Qt/Embedded 介绍.......................332 8.3 Qtopia 介绍..................................333 8.3.1 简介......................................333 8.3.2 Qtopia 平台的核心特征 ......334 8.3.3 Qtopia PDA 版本简介.........335 8.4 Qt/Embedded 和Qtopia 开发模式 ............................336 8.5 建立宿主机Qt/Embedded 与Qtopia 开发环境 .......337 8.5.1 安装tmake ................337 8.5.2 安装Qt/X11 ..............337 8.5.3 解压Qtopia...............340 8.5.4 安装Qt/Embedded....340 8.5.5 编译安装Qtopia .......341 8.5.6 运行Qtopia...............341 8.5.7 在PC上运行Hello程序..................................344 8.6 建立交叉编译的Qt/Embedded 开发环境 ................345 8.6.1 安装开发环境...............................345 8.6.2 在ARM中运行 Hello程序.........346 第9 章 Qt/Embedded 编程实战.......348 9.1 Hello程序...............348 9.2 按钮.........................350 9.3 Qt 信号和插槽........352 9.4 对话框.....................354 9.5 Qt 布局....................357 9.6 进度条.....................360 9.7 文本输入.................364 9.8 菜单.........................367 9.9 Qt 绘图....................371 9.10 国际化.....................374 9.11 往Qtopia 中安装应用程序 .........381 9.12 Designer 设计器 ...............................................382 第10章 MiniGUI 图形界面实验 ...................386 10.1 MiniGUI 移植实验...........386 10.2 对话框应用编程实验.......398 10.3 简易编辑器实验...............402 10.4 位图显示实验...................405 10.5 GDI 绘图实验...................407 附录 A USB 分析仪USB Analyst-I 简介....409 附录 B LA1032逻辑分析仪简介................ 411
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值