编程这个专业怎么样?

微信公众号:大帅兄 我想好好生活

本文字数巨多,请在阅读前做好心理准备。全文共8426字,阅读大概需要22分钟。

读者分类与提醒:本文主要讲计算机相关专业学生如何学好计算机编程,如果非计算机专业、对计算机兴趣不浓的读者,建议节省时间跳读章节标题及字体加粗内容直接放弃阅读如果是对计算机感兴趣、未来准备学习计算机的同学,那么这算是一篇很对路的文章;如果是这些同学的家长,建议努力感受一下您孩子未来可能经历的学习路径;如果是对计算机专业IT男/女程序猿等名词有过好奇欲一探究竟的朋友,此文也能提供一些“管中窥豹”的材料。最后进行最重要的强调:本文内容为个人经验与看法,无法保证适合每一个人,请批判地阅读理解。

基于文章标题,先抛出三个问题先。

一、为什么讲的是计算机专业学生?

其实非计算机专业学生、单纯对计算机感兴趣的朋友、甚至小孩子的父母家长,个人觉得都可以看看此文。但之所以标题限定为计算机专业学生,是希望聚焦所讨论的内容,这与本文标题最终想找出的一种“方法”或“路径”强相关——对于非计算机专业学生来说,大帅兄认为“学好”计算机的需求与标准皆不同于计算机专业学生(非计算机专业学生可根据本文大帅兄针对计算机专业学生的“学好”标准根据自身情况自行酌情定义)

二、计算机专业学生有没有可能学不好计算机?

答案非常肯定:有可能。

而且这个问题搁任何一个专业其实答案都一样。假定让100人在4年时间里通过一样的教育去学一样东西,在教育结束后检验所有人的专业水平,必然有高有低,甚至出现有人无法达到最基本要求的情况。

三、那怎么样叫学好?或者说怎么样叫学不好?

如果有一个精确的数字性的终验考核成绩,也就是所谓“分数”的话,那暂且可以认为分数达到及格的叫“好”,达不到的叫“不好”。达到及格的里面,又可以根据排名,分出良好、优秀、更好等等。

但这里的终验考核,我指的并非单纯地应试成绩,而是一种“应试成绩+技术实力”的综合评价。大帅兄在这里说的“学好计算机”=应试成绩好+技术实力强。如果要计算各自占的比重的话,我的观点是:学生阶段,五五开。这里多提一句,如果已经毕业,走入社会承担具体的岗位,比重相应变化,四六开吧。

首先解释一下两个名词——应试成绩,就是指考试成绩,找工作笔试成绩也包含。技术实力,就是计算机专业基础功底,比如编程、网络架构、问题分析与解决等。

其次解释一下这样划分比重的原因——学生阶段五五开,是因为我认为考试真的非常重要,哪怕是纯应试的。因为找工作招聘,对于用人单位来说笔试是非常简单有效的测试方法;考技术证件,也是纯考试;在学校里做学生,考试成绩不好,也的确很难说这个学生就学好了(考试成绩好的,技术实力也不一定真厉害)。步入社会四六开,之所以做出略微的调整,是因为在实际工作岗位上,确确实实的技术钻研和提升,可能与经常能碰到的考试场景不相关,提升技术实力的比重是一种对注重真实技术水平的引导和强调。

日常我们怎么能知道一个人技术实力强不强呢?基本是靠考试、竞赛、做出牛掰的作品、解决非常难的问题这些履历“证明”出来的。由于大帅兄定义学的好不好的标准将应试成绩单列出来了,所以导致技术实力缺少了“考试”、“竞赛”这类手法而变得很难测量。也就是说,按照我的定义标准,想要准确地测量出一个学生到底学好没学好,其实是非常困难的(约等于无法测量)。基于这种现实状况,大帅兄给出解决办法:当事人依据大帅兄的标准,自己对自己真实状态进行评估,说白了就是“忠于自己”。学好没学好,根据大帅兄的这个定义,自行判断。

在弄清楚以上三个问题后,我们进入正题,计算机(软件)专业学生怎么样学好计算机? 总结为“三个尽早知道”+“四个执行”

1、考试、比赛、考证很重要。

大学里,绩点成绩很重要。往大了说,不光计算机专业,任何专业,只要是学生阶段,好好学习好好考试就很重要。很多学生由于高中的压抑,以及部分媒体宣传的“能力更重要”的观念,上大学后容易忽视考试成绩,粗于学习。大帅兄自己就是典型的被这种思维坑害了的例子。殊不知,考试考的好,学院每年有奖学金,学校每年有奖学金,国家每年还有。而且种类还挺多,金额还很可观。而且,还可以保研,基本上如果本科学校还不错,大四毕业保本校研、甚至保清华北大中科院等更好学校的研也没有像高考那样难。这些实实在在的好处,大帅兄觉得你只要提早知道,在这样的“功利诱惑”下也一定不会太放纵而不去学习。

计算机类的比赛也非常多。学院有院级的计算机类比赛(主要是编程比赛),学校有学校级的,社会上各大公司级的(例如微软、百度、阿里巴巴等都有相关赛事),国家还有国家级的,例如机器人大赛(几乎都需要编程)、全国数学建模竞赛等,还有国际的国际大学生程序设计竞赛(ACM)等。真可谓只要有技在身,真真是四处是能够发挥的汪洋大海。大帅兄是已经到了大二,当这些比赛赤裸裸来到面前后才知道这些。而知道的时候,已然觉得大势晚矣,深深悔恨当初没有在课上认真听讲课下认真练习,业余时间没有自行学习精进,没有形成“长技”以击敌。同时也惋恨为什么没有一个人能够在大一的时候告诉自己将来有这么多重要的活动可以参加,只要你好好学习定能大放异彩。很多时候,一个比赛作品可以去参加很多赛事,这是非常“省事”的一个特点。而任何一个比赛得奖,都不仅是技术的锻炼,也是不断被业内熟知、专业化的过程。于精神于物质,这些都是宝贵的财富(拿国家奖很多大公司单位直接会发非常高薪的offer)。

考证,不要觉得计算机专业学生毕业不需要考全国计算机等级证书,就忽视考证。计算机专业类的证书有很多,国家层面的软考有初级、中级、高级的职业资格证书,具体根据方向不同分软件、网络、安全、数据库、嵌入式、信息系统项目管理师、系统架构师等。行业公司的证书也有很多,例如Oracle数据库相关的Oracle认证数据库管理员(OCA)、Oracle认证数据库管理专家(OCP)、Oracle认证数据库管理大师(OCM)等,微软、IBM、思科、华为等也都有相应的证书。这些证书的含金量也都非常高。例如当今行业内,如果做数据库,一个OCP基本上走遍天下都不怕。

2、编程语言不要比、不用多。

计算机专业学生几乎都会遇到的问题,就是在选修编程语言课程的时候,面对C、C++、C#、Java、Python等等到底学哪个?我要说的是,你只要能熟练掌握一门,哪一个都OK。

编程语言,哪怕区分面向对象和非面向对象的两种语言,本质上都具有非常大的相通性。我在工作这些年的感受是,编程(软件开发)与写文章是一样的。我们中国人用汉字写文章,写之前要构思文章结构,然后用一个个字呈现出来。编程也是,选一门(或多门语言),构思程序架构,然后用一行行代码实现。写文章的句子讲究富有逻辑、顺畅、达意、优美;写程序的代码也讲究逻辑、顺畅、实现功能、少错误。写文章一般还会进行修改润色,以及发表后有版权;写程序也要经过测试和修补晚上,以及发版后也有版权。真真的非常多的相似处。而构建软件,其实与程序语言的选择关联度不大(尤其现如今的技术发展更是如此),这与写文章用汉语写还是用英语写,影响不会特别大一样。不同的编程语言,难点在于熟悉,熟悉它的关键词、它独有的一些特点和用法、它的开发环境;这与我们学习不同国家的语言也是一样,难的是背诵单词、语法的规范、使用环境的差异。我的观点是,精研一门,举一反三。精研一门就已经很不容易和难得了,精才容易出成绩。而且大可不必担心没有学习另外一门语言,而错失很多机会。一方面,你精研一门,精的这一门提供的机会绝对不会少,而且往往多到让你已经应接不暇了根本不会有担忧错过其他语言机会的烦恼;另一方面,当你有了精研一门语言的基础,触类旁通,在有需要的时候掌握另外一门语言,也是短短数日即能达到,时间上完全来得及。倘若处于这种担忧,那想想世界上的技术变化和发展如此之快,那岂不是应该学会所有语言?——很明显,没有必要做这种愚昧的“担忧”。

网上各种媒体喜欢对编程语言进行一个排名,非要相较出一个高下来。提醒,切不可被这种舆论宣传给蒙骗了。首先,你知道媒体是怎么排名的吗?恐怕是很难说清楚。就算能说清楚一套评比标准,这标准又有多客观?无非拿一个的长处怼另一个的短处,用特殊处怼通用处。我认为单纯地比拼语言好坏是没有必要的。很多人关心语言的好坏,无非是希望选一个“更好”的,以便日后减少被抛弃的风险和和重新学习其他语言的成本。我有必要表达一下对当下热门语言的评价观点:没有一门是十全十美的,都是各有千秋,应用领域不同选择更适合的才是最明智合理的。例如,当下十分火爆的python,就一定要比过java吗?不是的。现在依旧有大量的网站系统,是用java开发的;每年数亿部安卓手机,不也是java开发的吗?选择了java的通用性和语言高级特性,比必然要承受它的相对臃肿,这是事物特性的两面,任何事物都不可能违背。而python轻量化,易用、学习成本更低的特点,也的确是java所不能及的。真正的现实情况是,很多项目,都是多种语言共同服务于一个项目的。例如大帅兄曾经所进行的手机项目的开发,应用层面用java,系统中间层(framework)用C,驱动层用C和汇编,做代码管理、版本控制、自动化测试用python等等。所以单纯地比两门语言的孰好孰坏,是没有太大意义的,重要的是取其所长,更好地实现自己的想法。而对于学生来说,我认为,与其关注谁好谁坏,不如学好其中一门,实实在在应用它创造更多价值出来才是王道。倘若真有一天一门语言衰落了,你一个渺小的个体,也早就有足够的时间去掌握另外一门新生代的语言。

3、选择由易到难的技术提升路径。

首先要有技术路径这个概念。这个可以被动、也可以主动。我强调的是增加主动规划的占比。例如你想毕业后从事芯片设计工作,那么本科阶段学好电路原理、模拟电子、数字逻辑、计算机组成与原理、计算机系统结构、逻辑数学等就很必要,开发语言上选择汇编、C等相对底层的语言就会比C++、Java等高级语言要好一些,网页开发、网络工程、信息安全等就可以有意识少涉及一些。规划和选择一条技术路径,本质上还是优化时间精力的安排。毕竟每个人的时间和精力都是有限的,紧紧围绕在自己的核心目标学习提升,效率上能提高不少,而且能避免动摇最后导致一事无成。

当然,现实中很可能许多人很难很早就能知道自己未来会做什么,或者未来想做什么。年轻人本来就具有很多不同的可能性与试错的机会。实在是无法规划和预料,也不必太着急和担忧,那学好当下的基础,练好当下的技术就可(已经很不容易了)。而未来,兵来将挡水来土掩,我认为也是好的,毕竟单靠计划是战胜不了“不确定性”的。只是,有提前规划的意识,并尽量在过程中规划好,更值得去尝试和努力。

其次是由易到难的认识。计算机技术的学习与提升,经历过后认为最害怕的情况就是好高骛远。构想非常宏伟和美好,却因为太过遥远,当下的技术远远达不到,而导致无从下手。或者由于能够开发出成型的作品的工作量太大,很难看到成果而难以坚持导致半途而废。所以,大帅兄认为非常非常重要的,就是由易到难,逐步迭代。迭代也符合软件开发的版本运维思想。尤其是个人技术的学习与提升,更宜采用迭代的方式。举个例子,不管从教科书或者专业技术书上找的demo代码,还是从网上拷贝的别人的工程代码,我建议原则上先弄最简单最基本的功能,学习吃透了,必然会觉得demo还有很多功能不够好值得优化,还有功能达不到要求需要添加。在这时再去动手添加或者优化,在做添加优化的时候,既是开发能力的锻炼,又容易引出新知识,从而继续学习其他内容。当你要的功能你通过现有的知识无法实现时,就是学习和提高的时候。这样几年下来,势必是一把开发的好手。刚才这个例子偏软件开发,再举个偏硬件开发的例子。例如买一块通用的嵌入式开发板,找一个基础示例,然后逐步扩展功能,逐步完善。甚至集成屏幕、各种传感器,甚至还能3D打印给做个定制外壳。各种技术就在不断改进中得到了学习锻炼。而两个例子,之所以容易持续,一是因为每次的迭代内容相对聚焦,个人能够实现;二是有不断优化能激发人的兴趣和成就感,从而进入一种迭代的良性循环中来。

不管是技术路径规划,还是由易到难的方式,归根结底都是为了执行。用编程开发来讲,就是上手练。考试的不二法门是做题,计算机编程也好,计算机其他技术学习提升也好,不二法门就是动手练。否则一切都是纸上谈兵,夸夸其谈,徒有其表。

1、专业课程打好基础。

这个“在考试很重要”里已经有论述,不再赘述。照大帅兄的看法,学校里所有开设的计算机基础类课程,都得好好学。知乎里有关于计算机专业哪几门课程最重要的提问,回答的大部分人点名的是以下几门:数字电路、计算机组成原理、汇编语言、操作系统、编译原理、离散数学、数据结构与算法、计算机网络等。

俗话说的好,近朱者赤近墨者黑。多逛论坛也是一种技术熏陶,看的多了有时候就有了创意点子,也容易引起兴趣。开博客,则是对自己日常学习的总结,当你要写一篇技术博客的时候,你就会发现可能原来理解的有不够深入的地方,进而促进自己的理解与提高。而日常开发学习,经常需要在网上找问题答案,也往往都会导向论坛博客。所以是相辅相成的。

必须有一个打造个人作品的心。考试、比赛、考证,都是外在的一种佐证。作品,大帅兄认为是比以上三种更实在的证明(当然社会上不一定这样评判,大帅兄前面有强调需要“忠于自己”去评判)。举一个世界上几位名人的例子来说明这个问题。比尔盖茨开发了windows视窗系统,乔布斯创造了苹果电脑和苹果手机,林纳斯开发了Linux,求伯君开发了WPS,雷军创造了小米,马云创造了阿里巴巴,马化腾开发了QQ等等。作品,是最有说服力的。当然,举世界名人的例子有点太“遥远”,拿我们平常个人来说,将平时的练习代码等等,加上个人的小创意或者小特色,都是可以成为一款作品的。或许它没有商业化,没有广大用户,但也是一款完整的作品。大帅兄觉得做到这样就很好了。现在苹果Apple Store、Google Play等应用商店都支持个人开发者,Github社区也是很好的开源平台,做自己的作品分享出来真的是非常赞的事情。当然有难度,但很值得做。(有心者也没那么难)

这里着重讲根据自己的经历设计的一条学习路径。人各有异,又大同小异,你也可以根据自己的情况设计更适合自己的。

(1)大学前,最好能学习掌握PS技术。以前上大学前计算机、移动设备远没有现如今这么发达。现在很多孩子从小学开始就有机会接触编程,基础应该是要好很多。大学前会的越多当然越好。之所以提PS技术,是因为这其实是一个工具学习,难度不大,不需要过多的计算机基础知识作为前提条件。而上大学后,学生们难免加入各种社团,而每个社团其实都需要出海报出新闻报道什么的,会PS简直是市场刚需。倒不是说为了一直在图片美化、海报设计道路上越走越远(毕竟不是美术类专业),而是会PS很“技术”,会提升计算机专业学生的技术自信心,对未来的计算机技术学习产生有益影响。而且,如果作为一个个人开发者,想要开发独立的APP,会基本的PS技术,也有利于独立完成图片切片等美工角色的工作。当然,同理,如果学会Premiere、绘声绘影等视频处理软件,也是极好的。

(2)大学前或刚上大学,开技术博客,学习HTML网页知识。开技术博客,一个是在专业技术博客网站上;另外一个,大帅兄建议尝试搭建独立的个人站点。虽然现在最火热的独立站点时代早已过去,但独立建站依然是很好的网站技术学习途径。搭建独立的个人站点,就会学习WordPress之类的站点引擎,然后学习域名申请、CSS配置等,掌握模板站点的技术。同时,如果需要美化界面,还会加强对PS的应用,以及引申出大型网站开发技术的涉猎。

(3)大一,配合专业课程的学习,建议学习并锻炼电脑的选购、配置、网线的制作、家庭(宿舍)网络搭建、电脑的基本维修,并学习一门编程语言,C或Python或其他。初识编程语言,初步认识程序语言到底是啥样子,并掌握计算机的发展历史,达到计算机与计算机语言入门。最好能个人提高,多练习这门语言的编程习题。

(4)大二,参加学院编程比赛、学校编程比赛,如果大一编程习题练的足够扎实,这时肯定可以得奖。配合大学计算机专业课程设置,开始对计算机专业的未来职业分类有了解。理解职业的多样化,就算同样是从事计算机相关行业,也可能有团队部门管理、产品管理、项目管理、硬件工程师、软件工程师(软件工程师还能细分为软件架构师、算法工程师、应用开发工程师等等)、数据库工程师、网络工程师、安全工程师等等。同时,积极参与学校级的项目。如果学习了算法、数据结构,做到尽量理解就够了,不必强求理解。建议在做学校项目或者自己练习的时候,不必思考算法,而是重点去学习《软件设计模式》(可找同类型的书籍),在接下来的三年编程练习中,不断熟练软件设计模式,以及加深理解。我认为在不断开发练习的过程中,自然在遇到需求的时候,会再回过头来学习算法等。此时,如果学有余力或者本身有选修Java等高级语言,也可以开始尝试网站开发学习。这会学习到数据库SQL、Tomcat、Apache、Spring、Hibernate等,并深入掌握Eclipse等集成开发环境。如果方向就是网站开发,那就着重学习;如果方向不是,根据个人情况可以选择。网站开发的时间节点不一定非是大二,但建议在大三结束前搞定。因为如果水平可以,网站开发接私活还是挺容易的。当然,必须提醒如果未来有其他的目标,也不要太被网站开发或私活占去太多时间。

(5)大三除了以上提到的技术继续跟进钻研外,必须学习掌握Linux,可以体验Ubuntu、RedHat、CentOS等。必须掌握Linux是因为开源的技术、思想可以借此得到学习。有机会可以对硬件设备进行了解,例如服务器、数据库设备、网络设备、安全设备等。大帅兄建议对网络拓扑进行深入地学习理解(网络基础课程可能大一、大二就会开设),信息安全(信息安全根据专业不同、学校不同,可能不一定有专门的课程)进行学习理解。之所以强调网络工程和信息安全,是因为大帅兄觉得本科还是以基础为主,对这两方面知识要进行专门学习理解,虽然对程序开发没有太大直接帮助,但对于建立计算机类项目宏观层面的高级认知有帮助(任何和计算机有关的项目,都无法避免会牵扯到网络和信息安全)。同时,根据个人方向选择,也可选择移动开发、大数据、人工智能等。当选择移动开发,安卓平台就会学习Android和Java、苹果平台就会学习Object C,大数据就会学习Ruby、Go等。在做作品或者项目的时候,学习Git、SVN等版本控制工具。最后强调的是,大帅兄认为大三是个黄金时刻,几乎所有计算机基础课程都有学习了,学生年龄、心智也都有了增长,所以大三要有作品做出来。学有余力的话尝试发表论文也是好的选择。

(6)大四,不断修正自己的技术方向,如果读研就可提前准备材料联系导师。并在项目锻炼中不断提高技术水平。有机会的情况下去各大软件公司、或者硬件厂商去实习锻炼。如果面临职业选择,优先大公司、知名公司。在这里,统述一下技术方向与最终的职业关系:其实只要扎实学习了计算机基础知识,达到了“学好”的水平,只要招计算机专业的公司,原则上任何公司都能够去。学校里学习的知识和技术,很少能直接匹配公司的岗位的。入职后公司都会进行培训,好的公司都会有少则几个月多则若干年的培养时期,所以不必担忧和困惑未来的技术方向。在入职以后,有时候个人的技术路线是会受公司的选择的影响的。我强调的是保持自己的专注度和钻研度,是不变法门。

洋洋洒洒大几千字,终于快收尾。


当你本质上很优秀,完全有能力做到很好,却在某些时刻发现自己处境尴尬“早已没有了回头路与选择”时,那种“早知如此”、“人生只有一次不能重来”“怎么就没有人能早点告诉我”之类的遗憾,才是最令人无奈的。

每个人都有惰性,任何事情任何人都逃不开惰性的干扰。但还存在有很大的成分,是没有那贵人的轻轻一“点拨”。也就是人生这个游戏,很多选择就只有一次,不能像虚拟的网络游戏,一次副本通不过,还可以不断研究不断修正一次次地挑战。

自己经历过后,深感一些大学中的计算机专业课程设置的不够合理(课程顺序安排、课程选择),深知有些老师水平的低下(中国大学里不乏泛泛之辈),以及“散养”状态下学生们的迷茫乱撞致使大部分时光被白白浪费的可惜。基于对自己的反思,论述成文。每个人的个人素质与境遇都不可能完全一致,所以大帅兄只是希望通过自己个人的分析,能让未来想选择计算机专业的同学们或对计算机感兴趣的朋友们,从我的描述中找到一些“经验”,获得一些认为更早了解会更好的观点也好,知识也罢。

邀请我,作为谢邀,我就把我的知乎上的首次认真回答献给这个问题好了。本人曾在中科大物理学院就读,现在在美国读PhD,跟了一个做分子动力学的老板,在做着machine learning的事情。

重要的写在最前面:其实“很厉害”是相对的,即使你在周围同学眼中计算机的能力非常高,但是跟那些真正的geek,甚至有点水平的专业CS学生相比,水平还是不知道差几条街的。

编程,或者更广泛地说是折腾电脑,可以切实改变你的生活。如果你会编程,工作生活中你就可以经常写一些简单的小程序来完成自己的一些特殊需求。而因为你的这项能力,也经常会有周围人求你帮忙,你也会借此认识一些人。

比如说我高三的时候,由于已经保送,在家里比较闲,于是我们高中班主任就让我把全班同学的评语都给写了,并且输入到教委给的系统里。评语这东西,写来写去无非也就是些糊弄人的话,比如说“该生尊敬师长、团结同学、热爱班集体、学习刻苦”之类的。教委的系统对评语是有查重的,所以还不能直接从网上下载评语。于是我就自己写了个程序,直接往系统写入随机生成的无重复的评语。后来这个事情被教务处的老师知道了,找我把程序要走了,从此以后全校的评语都是我的程序生成的了。

再比如说我本科宿舍学校不给通网,电信又通过各种恶心人的手段不让你用路由器,当时我就在我们宿舍电脑都搭建了代理服务器,成功人宿舍所有人实现了同时上网,周围有很多同学慕名前来求我帮忙搭建代理服务器,我也通过这个在同学心目中有一定的地位,经常有人有编程的问题前来求教,我也通过这个认识而不少人。

再补充个例子,比如说某次我QQ邮箱收到一个邮件,发件人名叫“妈妈”,内容说是我爸爸的体检状况之类的,让我点击查看,点击进去以后就让我输入QQ的用户名跟密码,一看就是盗号的。于是顺手写了个小程序往盗号网站的数据库里灌入大量垃圾数据,过不了多久那个网站就被迫下线了,也算是为广大网友做了点微薄的贡献吧。

最后,借此地方分享一下自己本科折腾电脑的一系列事情:

我本科所在的学校是不给本科生通网的,大一到大四都不给。于是,从大一开始,上网,就成了一个美好而奢侈的愿望。既然学校不给通网,办理电信的电话上网就成了唯一的选择。这个电信特别坑,只有2Mbps的速度,却要付高昂的资费。而且,电信会强迫你办他家的手机,并且强制你每月电话或短信消费10元以上,不然网费会更贵,为此我还特地买了个50元的二手电信手机,每个月自己给自己打100分钟。如果你遇到了问题,你会被校内跟校外的营业厅之间踢皮球,服务员个个脸板的跟家里死了人一样难看。最恶心的是,你必须用客户端拨号,目的就是为了不让你用路由器。于是,跟客户端做斗争就成了我业余时间做的事情之一。

最开始的想法是去破解客户端,上网查资料得到的结论是,这种客户端原理往往非常简单,实际上电信给你的密码并不是真正的密码,电信客户端做的事情是,把你输入的密码做一些简单的运算得到真正的密码,并且调用Windows的相应的API,进行拨号。网上给出的教程说的破解方法是,对网络进行抓包就能看到真实密码。于是尝试之,发现教程里面针对的电信拨号认证方式用的是Password

既然抓包获取不到,于是我便采用另一种方法,既然电信要拨号,那肯定要调用系统的API,那我就从系统的API入手,在API上挂上钩子(Hook),让API主动告诉我电信都在干啥。API Hook的原理其实很简单:从指令的角度来看,系统API的调用无非就是先将参数压栈,然后跳转到系统API的代码处。而我们要做的,无非就是在系统API代码的开头插入一条跳转指令,跳转到我们自己而代码,我们自己的代码负责读取栈中的参数,获取其中的真实密码,弹出对话框显示之,然后跳转回系统API的代码处。搞懂了Hook的原理,准备自己实现的时候,无意间发现已经有人干过这件事情了,遂直接用其代码。看到了真实的密码,心中更是千万头草泥马奔腾,真实密码竟然跟电信给我们的密码完全一样。

既然电信不是通过简简单单地篡改密码的手段,那电信又会是怎么知道我们是否在使用电信客户端呢?联想到之前观察到的事实:1. 自从安装了天翼客户端,系统就经常蓝屏,蓝屏的原因总是netfilter.sys。打开天翼客户端,点击链接,然后用任务管理器终止天翼客户端的进程,仍然能上网,此时在Windows的设置里面关闭网络,并重新拨号,正常连接到网络。于是断定电信是通过netfilter.sys这个文件来实现认证的。认真研究这个文件,发现这是一个Windows下的NDIS驱动。看来电信是直接把协议都给篡改了,这我就没办法了,及时破解了路由器也没法用啊。于是尝试另一条路:代理服务器。

最开始的时候我是想把自己的电脑搭建成透明代理或者网关服务器的,这样做的好处是,宿舍里的其他电脑只需要把网关设置好就行了,不需要每个应用单独设置。但是实践中发现他们都要用到系统驱动,而这个驱动跟电信的netfilter.sys是冲突的,所以没办法,只能用普通的代理服务器的方式了。于是我便在我们寝室所有的电脑上都装上了代理服务器,从此,我们宿舍终于过上了大家都能上网的日子,虽说不如用路由器那样方便。在那段时间,我们宿舍经常说的一句话是:“XXX,开代理”以及“XXX,你电脑IP是多少”。后来我们宿舍的集体上网的事情被一些同学知道,不少同学前来求我帮他们宿舍配置,还有不少同学听说我有办法让一个宿舍大家都能上网,也去电信营业厅办理了电话上网的服务。就这样,我通过给人弄网认识了不少人。有一次在食堂点菜,排队的时候我满脑子都在想代理服务器,于是点菜的时候差点说了句“来一碗代理服务器”,幸好及时意识到,改成了“来一碗牛肉面”。

在经历了三年宿舍没有网的日子以后。大四那年,我们寝室楼四楼有人提议说组建寝室大局域网的构想,具体做法就是用线将各个寝室的路由器连接起来,四楼很多同学纷纷响应加入,我当时是在三楼,听说了也加入了,并且跟那里的核心人物一起讨论网络优化。

刚开始的时候,我们的网络构架是,核心的那个宿舍找一台电脑作为服务器,上面跑着论坛、还有魔兽世界的私服。采用的网段是192.168.1.X,其他宿舍的路由器的Wan口连接核心宿舍的Lan口,并且其他宿舍的路由器ip都改成192.168.2.X。这样做的问题是,联机打dota的时候,核心宿舍创建的房间能被所有其他人看到,但是其他人创建的房间就看不到了。于是我们后来经过商量,把网络构架改成了各个路由器的LAN口相连,为了避免同一个局域网之间ip地址冲突的问题,我们改用10.x.x.x的地址,并且对ip地址的编码方式为:10.楼层.房间.x,这样的话,316房间的路由器的dhcp服务器只会分配10.3.16.x格式的地址。

后来我们还自己搭建了DNS服务器,我还用node.js写了个生成代理服务器配置的文件的服务器,方便寝室内不同同学连天翼的时候大家share网络的时候代理服务器的配置。

也真是难为了我们这帮学物理的了。。。

我要回帖

更多关于 代码编程 的文章

 

随机推荐