近日有一位同学发了个信息来问我关于大学生如何强大起来。
原文如下: 大学期间c++等专业课,一定要学的十分牛吗?会影响你在以后的发展吗?怎幺能是自己变的强大起来?谢谢我是大一的学生希望前辈给些建议 |
其实,关于这个话题,一直以来都有很多同学、朋友和我一起探讨。只是本人觉得,我还没有“成功”。如果现在谈这个话题,可能有点“班门弄斧”了。
回忆过去----我的PC萌芽时期
(我眼中的计算机10年历程)
我自己从中学时代到现在,一直从事计算机相关的工作、学习。这么些年的学习、工作也积累了些经验,今天拿出来和大家一起交流、探索。
记得95年开始,接触了MS-DOS,那个时代,可能会点“DOS命令”就可以算高手,再懂点BASIC语言就算是程序员了吧。在那个时代,从MS-DOS、MSDOS6.22、windows31、windows95、windows98、windowsME一路走过来。
在MS-DOS时代,每1个“玩电脑”的人,可能都是“高手”。毕竟无论你做什么事都得敲命令。到了2012年的今天,会玩电脑、会操作的电脑的人不一定懂计算机了,这就是为什么计算机可以普及的一个原因吧。
DOS的时代,产生了很多“英雄级人物”,王江民、求伯君、梁肇新、
KV300,改写中国计算机杀毒世的产品,也是创造“单月销售超过千万的历史最好记录”。当然今天的“KV杀毒雄风已经不如当年了”
在wps的时代了,什么是office、什么是word,估计很少有人知道!不像现在,国人只知office!WORD、PPT成为了行业标准。
在我的成长路上,梁肇新所撰写的“编程思想”一书对我影响较大。不过,现在这本书已经很难找到了,因此我摘录了部分“法则”
http://blog.csdn.net/ex_net/article/details/6916451
“超级解霸”相信很多搞计算机的70、80后都不陌生,Skin(换皮肤)就是从哪个时代的产物。超级解霸的成功可能缘于VCD吧,97,98年盗版VCD铺天盖地,电脑播放VCD可能是作为多媒体电脑的一个重要特征之一。除了win95、win98是必装软件外,就是“超级解霸”了。
在这一阶段我学会了DOS命令、BASIC语言、操作系统的安装。回忆当时的行情,装一次系统是RMB:100元,随便帮人整整电脑大概50元一次。心动的我,都有点想放弃学业,去做一个“电脑技师”了,每天除了学习,就是拎着自己“攒”的“系统盘”四处帮人“整电脑”。说实话,那个时候的系统盘无非是“D版的win95、win98系统”而已,现在说出来,自己都会觉得脸红(盗版)。
一个合格的电脑技师其实就是“系统盘”“工具盘”“启动盘”。有了这3张盘,基本可以“走遍天下都不怕!”
回忆起2000年,我到云师大参加“全国计算机等级考试2级”,看到旁边的一位年长的同学“问”监考老师“老师,[ te bo c ](TurboC) 怎么调出来?”,当时还觉得奇怪暗暗自喜(TC都找不到,还来考试!)。结果奇迹发生了,不到40分钟,这位学者完美交卷了。经过监考老师的检查“成绩不为0” !那么估计就是100分了。
一个经典的入门代码,虽然很多同学都会写?但是真正可以理解这段代码的内核的同学是少之又少。
hello word!
hello word作为入门代码,每一个初学者的入门课程。实际上,我是比较反对用hello, world作为入门课程的。至于为什么,我也说不准,只是觉得这个太枯燥了。很多“学完”C语言的同学,脑子里好像觉得C语言就是用来做“字符打印\加减乘除的”。
在1995年到2000年的时间里,还发生了很多知名事件,面对每一次事件,都是一次学习的机会。
事件一、逻辑炸弹
97年的逻辑炸弹,让很多KV300的“盗版用户”尝尽了苦楚。
计算机中的“逻辑炸弹”是指在特定逻辑条件满足时,实施破坏的计算机程序,该程序触发后造成计算机数据丢失、计算机不能从硬盘或者软盘引导,甚至会使整个系统瘫痪,并出现物理损坏的虚假现象。 |
结果这次事件,我学会了Debug。知道了硬盘分区表、了解了BIOS中断。
计算机启动的基本流程
(1)首先是主板加电
(2)BIOS进行自检,在一些很老的电脑上还可以看到如下的界面
在这一阶段,计算机有BIOS完成自检。主要进行CPU、RAM(内存)、硬盘、光驱等设备的检测。自检成功后往往可以听到“滴“的一声。
很多计算机维修工程师初期主要是靠”听音识别故障”
例如:Award BIOS 的报警声音
通常情况下,如果有问题就会按“DEL键”进BIOS修改参数,或者检查。
在那个时候,经常出现由于启动顺序设置不对、硬盘主从盘设置不对、或者硬盘的工作模式设置不对造成无法启动
(3)BIOS自检完成后, BIOS就把启动权交到了OS(操作系统)
这一个环节实际上将CPU的执行地址跳转到启动盘(软盘、光驱、硬盘)的启动扇区。
例如:
如果要让计算机可以从软盘启动,那么可以用 format /s a: (该命令在 dos 、win95/98/ME 下有效)
如果要计算机从光盘启动, 那么首先要制作可以启动的软盘,然后将软盘镜像为img文件,通过刻录软件烧写到CD-ROM的指定扇区。
对于windows系统,如果要让计算机从硬盘启动,那么需要在硬盘分区后,设置“启动分区”很多初学者对硬盘分区后,安装完系统,发现计算机无法启动时。往往都是由于没有指定“启动分区”。尤其是用GHOST恢复的系统。
设置启动分区实际上就是把该分区的标志位设置为:80h
(4)系统从80h开始启动,然后依次加载windows的内核,逐步完成windows 的操作系统启动
事件二、CIH病毒
CIH病毒是一种能够破坏计算机系统硬件的恶性病毒。据目前掌握的材料来看,这个病毒产自台湾,最早随国际两大盗版集团贩卖的盗版光盘在欧美等地广泛传播,随后进一步通过Internet传播到全世界各个角落。
在99年的4月26日,我像往常一样打开电脑,准备打字。确发现电脑开机后蓝蓝的一片,显示一些莫名其妙的字符。傻乎乎的我,关机、开机、再关机、再开机。折腾了老半天。直到几天后到昆明才打听到中CIH了。作为全球第一款破坏硬件的病毒,它的出现真实震动了世界。
其实,CIH的出现也是伴随着半导体技术的发展产生的,98年后Flash 的出现,让很多主板生成商,将BIOS程序放入了Flash的闪存芯片内。这就为CIH破坏主板提供了物理条件。在那个时候,我从“高人”朋友指点后,学到了用“编程器”将程序从Flash芯片读取后烧写进“紫外线擦写的ROM芯片”里。这一招对抗CIH是相当管用的。
名词介绍:
FLASH:Flash 是闪存,可以反复读写的一种存储介质,掉电后数据不会丢失
紫外线擦除ROM:紫外线擦除ROM是一种特殊的EEPROM芯片,该芯片要擦除数据时就用太阳晒晒,写数据时用12V以上的电压写入。因此,只要不见阳光,就不怕CIH病毒。
事件三、千年虫Y2K
计算机2000年问题,又叫做“2000年病毒”、“千年虫”、“电脑千禧年问千年虫题”或“千年病毒”。缩写为“Y2K”。是指在某些使用了计算机程序的智能系统(包括计算机系统、自动控制芯片等)中,由于其中的年份只使用两位十进制数来表示,因此当系统进行(或涉及到)跨世纪的日期处理运 算时(如多个日期之间的计算或比较等),就会出现错误的结果,进而引发各种各样的系统功 能紊乱甚至崩溃。 |
说实话,千年虫在我印象中并没有那么可怕。因为他就没在我身上发生。可怜我那个时候,还抬个小板凳陪着父亲一起,看着windows的那个时钟1分1秒的走过。终于到了2000年了。呵呵
不过千年虫问题上,学会了计算机的硬件编程方面的知识。
事件四、dot-com泡沫
互联网泡沫(又称科网泡沫或dot泡沫)指自1995年至2001年间的投机泡沫,在欧美及亚洲多个国家的股票市场中,与科技及新兴的互联网相关企业股价高速上升的事件 |
记得,在那个时候,“个人主页”是很多电脑爱好者的象征、嗜好吧。56K的小猫在2000年进入了我家,也就在这个时候第一次体验到“上网冲浪”。
免费空间、免费域名、包括现在流行的“花生壳”都是那个时候的产物。不过时至今日只有“花生壳”活了下来,个人主页被现在的Blog取代了。
在2000年,经常听到“谁、谁、谁”的个人主页获得了多少“点击量”,点击量==Money!!!,我也被深深的吸引了,每天都去自己点击自己的主页,希望多点点击量。当大家都在沉迷在“提升点击量”的时候,互联网泡沫出现了。大量的个人主页死掉了,点击量从刚开始的100次=0.1元钱,直线贬值到1000=0.01元了。就像股市一样开始一路狂飙。我印象里记得,最后好像是跌到了10000次=0.01元了把。。。。
本想靠这个赚点小钱的我开始失望了。。。我开始后悔,我怎么比别人慢半拍呢?我要是早1年做,也许可以赚点。
事件四、共享软件
互联网泡沫出现后,自我感觉良好的我,开始吧目光转向了DBMS系统了,随着IT行业的发展,计算机进入到了各个行业,DBMS系统一个系统玩玩可以卖到1,2万元,甚至更贵。
Y2K后,我进入了高中,也就在这个时候,我不在满足仅仅会装系统,会敲几个命令,会写几行BASIC了。目光盯上了“数据库”,因为我觉得数据库就是金子。的确,在2012年的今天,数据任然是很多业务系统的核心。
98年前,因为“年龄”问题,不能创业,看着别人修电脑、大把大把的赚钱,自己只能感叹!
2000年前, 只恨自己发现“互联网”太晚,错过了“创业”最佳时机!
现在,感觉机会来了!开始了一路狂学,FoxBase、Visual FoxPro、Visual Basic
不过很可惜,当自己吧FoxPro 学会了,发现世界变了,单机版的数据库应用系统已经不流行了。
软件从:单机版 已经 发展到 多机联网了
现实: 小商店 已经 发展到了 连锁店模式了
不得已,又开始了“网络编程”学习。这个时候开始了.NET进军了。
随着时间的推移,到了2003年左右, 国产共享软件已经发展到了巅峰,基本“只要你想到的软件,都有了”,这个世界不在缺你!突然间发现自己失去了方向,学了那么多年的技术,突然间觉得“英雄无用武之地了”。
共享软件是在80年代发展起来的,当时是依靠软件发行商发行磁盘来发放软件试用版,并通过邮购或者信用卡收取软件注册费。随着网络的高速普及和网络技术的快速提高,给共享软件创造了前所未有的发展机遇,使共享软件的传播、收费、注册变得非常便利,只需坐在电脑前通过网络就都能实现,共享软件迎来了辉煌时代。 |
微软4亿美元价格收购了Hotmail的传奇深深影响了很多人。
Foxmail、FlashGet、NetAnts 创造了一个个奇迹,也激励了很多热血青年,当然也包括我在内。
不过,说实话截止到2006年,我还是一事无成!
总结一下,截止到2006学过、碰过的技术、语言
启蒙语言:BASIC,第1次是在小霸王学习机上“玩”过,为什么称之为“玩”呢?因为俺那个时候是小学的文化,真是无法理解PRINT、GOTO。呵呵
入门语言:FOXBASE 语言,也许是路没走对,学习了一个相当难整的东西,不过好在中国人发明了“雅奇MIS”,由了它的帮助,可以自动生成80%左右的代码。
第1次全面的学习:Visual Basic6.0 ,从这个时候开始,总算走入了编程的殿堂。随着编程学习深入,发现VB对系统的操作、控制能力不强。因此开始了API学习。通过windows API操作,让 VB 去调用系统的资源。用VB去调用API,主要是为了创建“异形窗口”“不规则窗口”。
自从迷上了编程,尤其是通过VB打开了编程殿堂的大门。随之而来的就是我开始了漫漫“长征路”
VB 、C语言、C++、Pascal、Java、J++、C#、C++.NET常见的语言,几乎都学了一个遍,生怕自己落后!
起步篇
(思想决定高度)
回忆完了过去,看看现在的我,也许真的应验了老人说的“30而立”,真是快到了30,才醒悟!
20岁(女)——桃李年华;
24岁(女)花信年华;
至出嫁—— 梅之年;
至30岁(女)——半老徐娘;
20岁(男)——弱冠;
30岁(男)——而立之年;
40岁(男)——不惑之年、强壮之年;
50岁——年逾半百、知非之年、知命之年、艾服之年、大衍之年;
60岁——花甲、平头甲子、耳顺之年、杖乡之年;
70岁——古稀、杖国之年、致事之年、致政之年;
80岁——杖朝之年;
80~90岁——耄耋之年;
90岁鲐背之年;
100岁——期颐。
其实,计算机语言就像“武功招式”,无论你学的再多,再深,你也仅仅是个工具玩家!因为如果你不具备“编程素质”,学再多的语言也是无用的。从2008年以来,我投身了教育事业。通过自己教学、实验,结合自己大学时代的课程。
得出一个结论,在校大学生到底学了些什么?其实,我感觉他们仅仅学会了玩弄工具。VB、VC、Java、.NET学了一个遍。
数据库:Access、MS SQL2000、Oracle都学,成天热衷于各大厂家的“杰作”
从自身来看,大学生应该学习的是“思想”而不是“工具、语言”。
如果要真正的成为“高手”,一定得有思想,“编程的思想”。
面临一个问题的时候,选择什么语言、用那种开发工具、采取何种平台去完成这件事,是比较关键的。
2011年下半年,我与朋友一起开始了人生的第2次创业,共同组建科技公司,从事软硬件产品开发。我的思想、方向也开始了变化。在团队组建初期,公司招聘了很多人,都是应届毕业生。说实话,通过他们可以看出校园学的知识与工作岗位需要的知识,真是差距很大。尤其是解决实际问题的能力不足。因为我自己从事了3年的教师工作,因此逐步形成了定期对他们培训的计划,通过定期培训,逐步给团队成员灌输“编程的思想”。
在我看来,编程的思想就是解决实际问题的思路。无论多么复杂的业务,最终一定是可以分解为“输入”-----“输出”的。学过单片机的同学,有没有发现CPU的管脚都是“标示”为I/O,在硬件上,计算机是按照输入、输出设计的。那么软件也是一样。
那么如何提高自己的编程思路呢?
我总结了以下几点:
(1)重视“需求分析”,学过计算机软件工程、系统工程的同学都会背这一篇。
(2)多多查阅资料,面对一个项目(问题)时,多用google、百度查找相关资料。主要是查找别人对该问题的“解决方案”、“系统架构资料”
(3)学会“画图”比学会“语言”重要,尤其是绘制系统架构图。
例如,我最近正在计划开发的一个系统平台。
良好的绘图基础是成功的开始。(当然,我现在还没有成功,可能没有资格这么说。但是我相信,将来的某一天我成功了,那么这句话一定是“至理名言”)
(4)对待技术,要学会“浅尝辄止”,因为IT行业是高风险行业,每天都会有新技术产生。你不可能每天都去跟随新技术跑的。尤其新技术往往带有“厂商”利益。
例如:symbian 、Android、IOS之争,谁能笑到最后?
谁都不好确定,既然无法确定,作为小角色的我们,怎么办呢?
(5)万变不离其宗
软件无论怎么变,单机变多机,C /S变 B/S,但是核心都是为人民提供服务,只要可以提供服务,满足用户的需求。没有人会管你是用什么技术开发的!
可能会有些人吹嘘:“你看我们的软件是采用了xxx 技术,xxxx平台,最新最强的 xxxx平台”,这一切都是广告语。用户关心的只是,能不能用?好不好用!
而我们要做的就是,选择自己最熟悉的技术、最稳定的方法,完成用户的需求。
软件开发在我看来,就是解决用户需求的过程!编程(敲代码)仅仅是这项活动中的体力活而已!
编程切忌“盖空中楼阁”,学习切忌“囫囵吞枣”
软件的编程,在我理解为有2层含义: 一是设计,二是敲代码。例如,“学生成绩管理系统”,很多老师都喜欢作为课程设计或实验的题目,甚至作为毕业设计。
题目虽好,但是70%~80%的结果都是令人失望的。因为大多数交上来的“作品”都是用代码堆砌的,没有任何“设计思想”可言。
好的软件,靠的是“设计”,而不是代码。
从我的个人经历来看,如果一个不懂DOS、不懂DEBUG调试技术的人,是很难写出高水准的程序的。就算能写出“代码”也只能是皮毛。任何技术的发展,都是传承在此之前的“优秀技术”总和。
由于DOS是一个黑暗的时代,因此“苹果”开创了“桌面”操作时代,当然可能很多人为认为windows是微软公司发明的。其实究竟是“乔布斯”还是“比尔盖茨”都不重用了,重用的是DOS到Windows的转变,将电脑的“使用难度”降低了。这就是一个设计理念的改变,计算机不再是“科学家”的玩物。
当然,Windows的出现,也改变了“编程”。Basic语言被冠上了 Visual,C++语言被冠上了Visual。
没有“Visual 可视”的年代,就算是最基本、最简单的 Basic编程,你也得懂“DOS命令”、懂计算机中断地址。
可能有人会问 学DOS命令有什么好处呢?
至少在没有杀毒软件时,中了“ARP攻击”你还可以临时拯救哈计算机。呵呵
在DOS时代,bat(批处理)技术也是一门高深的“编程技术”。如果把DOS学会掌握了,那么Linux的Shell编程,也会事半功倍!
Linux下,一直没有一个Visual Studio 航母级的集成开发环境,大量的软件编译、配置、安装都还依赖于shell,因此很多初学者往往很难入门。
如果你对 Linux C/C++编程感兴趣,也可以在Linux下用 Eclipse来学习开发http://blog.csdn.net/ex_net/article/details/7251664
DOS时代,所有的程序都可以通过DOS中断、BIOS中断获取到计算机的控制权。但是在Windows 2000/XP 下就很难这么操作了。
如果编程是从Windows XP环境下 C++ 起步,那么可能对 windows API这个东西会觉得莫名其妙的。
如果编程是从Windows XP环境下 C# 或 Java起步,那么可能对 windows API 是什么都可能不知道了!
那么windows API 这个东西有必要掌握吗?对于打算从事计算机软件设计、编程的同学来说,是很有必要的。通过windows API学习,你的软件设计思想可以拓宽了很多,你将不在受制了语言的约束。
举个例子:
Q1、编写一个程序,将计算机在某一个时刻关机。
给你5分钟,你可以想到办法吗?(C语言、C++、JAVA。。。。凡是能看到的语言,你都可以选择)
Q2、编写一个程序,可以在Linux或Windows 下将计算机在莫一个时刻关机。
给你5分钟,你可以想到办法来实现吗?
以上这2个问题,解决的办法至少有几十种。你可以写出几种?但是无论你怎么写,怎么编程,怎么去实现它,最终的核心编程思想都是一样。
(1)调用DOS中断关机
(2)调用操作系统API接口关机
例如: windows:
BOOL ExitWindowsEx( UINT uFlags, // 关闭参数
DWORD dwReserved // 系统保留,一般取0
);
(3)调用操作系统 Shell,调用程序关机
Linux : system("halt") 或 system("init 0")
windows: shell(c:/windows/system32/shutdown.exe)
以上代码或方法仅仅适用于C / C++, 如果是C# 或 Java 那么怎么办呢?
在C#下, 可以通过调用API函数来完成,仅仅比VC多一个操作,就是要把Windows API函数进行封装
在Java下, 稍微有点麻烦。 得通过JNI调用了。首先将关机的函数封装在C代码里, 然后用 gcc 或 g++编译。然后再在Java里进行本地调用。实际上Java仅仅充当了GUI作用,而所有的操作代码均在C程序里完成了。
当然,这么做,很可能还无法实现,因为可能遇到C程序没有权限。那么怎么办呢?
换个思路,用VC写一个后台服务程序负责关机,然后采用 Socket编程,监听本机的某一个端口(例如8000),至于协议(TCP、UDP)随便了。
这样做后,其实无所谓客户端程序了, Java、C#、只要是可以提供Socket访问的语言,都可以通过TCP或UDP和服务程序通讯完成关机了。
。。。罗罗嗦说了这么多。。。
其实就想告诉大家2个观点
观点1:“对待技术一定要【广】,当你知道的知识越【广】,你解决问题的思路就越【宽】。你解决问题的能力就越高”
观点2:“不要认为过时的技术就没用”,技术是不会过时的,而是换了个地方应用。
计算机从z80、8086、80286、80386、80486、80586、奔腾、奔腾4、酷睿。。。。。一路走来。
如果学电子的同学有没有去对比 z80、8086 和 C51、S51这些单片机的,如果你去对比,你会发现原来单片机与最早最早的计算机是惊人的相似!
编程不应有门户之见
很多朋友经常问我:
学Java好?还是学C#好?
学C好?还是学C++好?
软件是采用C/S 还是 B/S 好?
诸如此类的问题多而再多。我是一个“实用主义”者,信奉的是“拿来主义”。对于语言、工具,我个人认为没有必要去在意。工具也好、语言也好,都是给人们用来解决问题的。以其在一颗树上吊死,还不如柳暗花明又一村!
不同的语言都有不同的用途和领域。就像如果基于80C51单片机编程,你非要去找C#或Java编程,可能吗?(也许今后可能,因为有些公司的ARM处理器已经支持Java程序了)
就拿做动态网站来说,ASP、ASP.NET、PHP、JSP、CGI,到底学什么好呢? 这个问题真是很难回答?
但是无论你学什么,总会找到工作的。
因为:无论是用ASP 还是 PHP,其实结果一样的,既然结果是一样的,那么仅仅是实现的过程不同而已。问题的关键在于,你对结果的预期、对过程的把握!
如果,老板交代你做一个网站,你首先应该想到的是“预期结果”占什么样?然后才是选择哪种工具来“干”这个活而已。
学的语言再多,如果不能总结出适合自己的思想,那么还是白学了!
我经常对我的学生、朋友这么讲:
懂C语言的话,学C++最多只要1周,
懂C++语言的话,学Java最多1天
懂Java语言的话,学C#最多几个小时
如何才能到达上面的境界呢?关键还是在于“编程思想”。因为解决问题的关键是“思想”,而“语言”仅仅是工具。
好比种地一样,有3亩地要播种,你可以用“锄头”,也可以用“双手刨”,当然也可以用“播种机”。
未完待续,今天就先写到这里吧!
夜已深,小孩已经入睡了,希望明天是个好天气!