现在的位置: 首页 > 综合 > 正文

大学生是否应该搞ACM

2014年01月25日 ⁄ 综合 ⁄ 共 5158字 ⁄ 字号 评论关闭

以下信息并非个人意见,是来自网络上的信息,仅供参考!
----------------
问:我想做项目,老师却推荐参加acm,身边的朋友很多选择了acm,acm对未来的发展很有用吗?
答:这个难说呀~~ 自己说点薄见吧:
     ACM ,从某种角度上来说不能说它很重要吧, 因为,你学习了它两三年之后,不一定是牛人! 牛人出来咱就不说,“销路”肯定很好了。 如果,混的不是很咋地,那么你出来 很多中小型公司一般都不需要你这样的人。 为什么呢?  因为ACM 重在算法设计方面的,而一般的中小型公司对这个要求不是很高,他们只要做写网站呀,办公软件什么的,事务流程处理方面的,即使偶尔碰到一般的不是非常复杂的算法方面的,请教人就可以了。  
      这个就和做项目不一样呀, 是不是? 在大学做了一两年项目,效果明显呀。 咔,什么JAVA 呀,JSP,ASP, strut ,spring ,java , ajax 一堆 啥东西都了解些,出去可以直接上手不是? 外面中小型公司就喜欢这样的,出来就能干活的。 所以学习做项目出去找事做容易。

     但是呢,话说回来了,做项目这个东西嘛,如果你只停留在不停的只是使用别人的框架控件,拿来合理的组和起来使用,处理一些流程事务,搞范围窄,搞多了,总那些东西,只是不断重复的写代码。结果就像代码工人一样。  

     在说说ACM, ACM 是考算法。ACM 里面代码长的不一定就很牛逼(有些人老是喜欢把代码长度来作为衡量),别人一个不到百来行代码就是短小,精悍,就是胜过你那几百行的代码。 别人代码跑起来,就是比你快,比你耗空间少。 这是为什么? 别人的算法,思路比你更加高明。 别人的代码,就是赤裸裸的放在你面前,你就是搞不懂他这是为什么? 这种搞不懂,和你那种学习新知识不一样。新知识,要么是不懂语句意思,或者不清楚其底层结构而搞不明白。 这种搞不懂,是你不知道为什么这么解决问题,不明白他用的是什么思路。 ACM
是智慧的比拼。
     搞过ACM 的人,如果再做项目或编程其它的,肯定有个惯性思维就是: 这种方法实现好不好,会考虑效率怎么样的问题。如果现在 这种效率低,你总会不自觉的去想如何解决这种低效率问题。   而且,搞ACM 后,写的代码肯定要比以前紧凑些。 因为在ACM 有时方法上一样,但是你实现起来,别人跑的速度明显比你快。所以你会慢慢不自觉的养成写成高效率的代码的习惯。
  
    我总是觉得,如果做界面,数据流程控制是外表的话,那么算法是核心。而且,如果你对算法有了很精通,那么对你以后的计算机进一步发展有很大帮助。 为什么呢? 因为,计算机编程深层的东西,往往牵涉到算法方面的知识。因为,深一点的总是需要更高的效率和更少的空间需求。 如果你要做出一个高效的东西出来呀。 高效东西做出来,不是人人都能做的,思路肯定要比别人先进呀。比如:你做个路径地图查找位置的软件,你查找一个简单的图跑个几分钟,甚至几十分钟,抑或更恐怖就是“Windows office 系统,嘎~~ 死了~”,这样你的界面做的再漂亮,你的数据传输,逻辑控制再好,就是赶不上别人界面简单(抑或更简单些,就dos
那种黑屏界面),但能几秒钟内搞定的东西。
      当然,这说的有些片面了些。 说点薄见,肯定有不适之处。 我现在上论坛,常常看到有些做项目的人 说: 现在如果项目一牵涉到算法方面的就头痛。  CSDN 上一个 专家也提到如果在计算机方面有更深的发展,算法是很重要的。
-----------------
问:ACM有那么重要吗?
我来自杭州电子科技大学软件工程专业,我们的老师极力鼓吹ACM 的重要性,经常组织比赛,好像不会ACM就不能就业.请大家分析一下.

答:这么和你说吧,我大学的时候参加过ACM,后来去微软亚洲研究院实习的时候的面试题都相当EASY,都是平时接触过的题目。
不是说ACM重要,而是算法的重要性,啊懂?

acm只是一个比赛,但是这个比赛却能带动学习的积极性,如果是全省性或者全国性的,乃至国际性的acm那就有一定的证明力,比什么什么证书那可强多了
-----------------
问:学习ACM算法在公司工作时应用大吗?算法人员地位很好嘛?
答:这要看你在什么类型的公司了。像搜索引擎类型的公司,比如谷歌和百度,很喜欢ACM得奖的人,因为他们有着非常庞大的数据库要管理,每天要不断的更新,添加,删除,修改之类的,需要非常好的算法和数据结构才能有效的进行这类工作,所以他们很喜欢理论派的人,尤其是ACM好的。如果是一般的软件公司就不是那么的看重。有些由于软件规模较小,不需要过渡优化,有些可能是软件本身的特点,用不着那些算法,比如游戏。而如果是涉及到底层的东西,比如操作系统,这些ACM的东西几乎用不上,因为硬件完全限制了算法的使用范围,比如很多地方只能进行位运算或者一个字节一个字节的来。总之算法人员只有在正确的地方才能发挥自己的价值,不像编程人员在哪里都可以。如果你能进入谷歌这类的公司那你可能蛮吃香的,否则其他的方的话很难有用武之地
-----------------
有同学提问:
===============================================================
杨中科老师你好,我想向你咨询下工作的事情。
先介绍我的情况普通本科大二学生,,之前一直在练acm的题,也获得了一些大赛的奖项,有一天有个人问我,叫我做一个小软件,我发现我不会。。更惨的就是我好像什么软件都不会做(这里指的是基于c/c++的开发),,除了console的一些算法题,,然后我和自己说练acm够了,应该开始学开发工具的运用和一些库类(函数)的使用了,,这样2个星期下来,我翻了很多关于商业程序开发资料,我发现商业程序代码真的很少涉及到高效算法和一些特殊的数据结构,而且我也问了几个现在在公司上班的师兄,他们也说工作中真正用到acm的知识是很少很少的。现在一系列的ACM比赛又差不多开始了,我现在一直没准备。。
    老师我想问的就是以你多年的工作经验来看,具有ACM背景的人的优势在哪,,还有优势大吗?还有假如我如果现在(大二)拿ACM的获奖证书和带上之前开发一些小软件的实例去找工作的话,,人家会很轻易的接受我吗?其实我大一的时候就获得了金山软件公司的实习邀请,,不过他说等到我大三暑假的时候才让我去,但是我家的经济深受这次金融风暴的打击,,所以我想大二读完的时候就出去找工作帮轻下家里负担,,我很期望您的回答。。
               还有我补充下我的个人简历,,我跟过一老师做基于.net的关于某公安局的项目,,英语四级,,是学生干部,,学习成绩80分以上,但是我看了看就业形势真的太差了,,我一直在担心公司为什么要我个大学都没毕业的。。
              最后我还想问下我除了专业领域获过一些奖项,我在其他的专业课程上也获过奖的,例如 一个全国性的营销比赛,这对我找技术方面的工作有优势吗。。。还有我之前我看到您大学的时候投过稿,不知道这对你找工作的时候会有优势吗,因为我一直也想投稿到一些杂志和报纸。但因时间太紧。。一直未能如愿。
====================================================================
我的回复:
你说的“商业程序代码真的很少涉及到高效算法和一些特殊的数据结构”这是实际情况,因为并不是所有的公司的产品都是理论性很强的产品,就像造山寨手机的人不需要懂太多芯片设计等方面的知识,只要会把大公司制造的手机芯片拼装起来,然后装一个外壳就可以了。“高效算法和一些特殊的数据结构”已经由IBM、微软等大公司解决了,制造成了一些类库、应用服务器、数据库服务器之类的“零件”,商业程序开发者只要把这些零件按照需要拼装起来就可以了。在大公司工作的人是少数的,所以你问的师兄估计也都不是在这些大公司工作的,所以他们说“工作中真正用到acm的知识是很少很少的”也是可以理解的。

ACM被誉为计算机界奥林匹克,每年的获奖者都几乎被google、微软、IBM、百度等大公司哄抢一空,很多大公司赞助ACM赛事的目的就是“近水楼台”,能够比其他竞争对手笼络更多的人才。

ACM可以看做是“聪明者的游戏”,在ACM题目研究深入的人通常有非常高的数学素养、计算机算法素养以及非常强的分析问题、解决问题以及动手的能力,能够处理各种高精尖的难题,这是各大公司哄抢ACM人才的主要原因。

ACM的程序开发和开发商业软件的不同点就在于写ACM程序是研究(Research),而写商业程序是开发(Development),这就是研发(Research&Development)两个字的含义,“研发”就是“研究开发”,像微软、IBM等这样的公司都将研发人才分为两种:研究性人才和开发性人才。以微软为例,在中国,微软设立了微软亚洲研究院,同时微软亚洲研究院下设微软亚洲工程院,微软亚洲研究院中的人主要的工作就是出paper(论文),根据微软总部下达的研究方向进行核心技术的研究,然后将研究成果转换为可以实施的方案,由微软亚洲工程院的工程师进行实际的开发,简单的讲就是微软亚洲研究院的人负责研究课题,然后由微软亚洲工程院的工程师根据研究结果开发出实际可用的商业化产品。因此微软亚洲研究院的人都是拥有很强科研实力的人,而微软亚洲工程院的人则是有很强开发能力的人。像google、IBM等大公司也有类似的部门职位划分。对于一些次一级的大公司来说,比如百度、网易等,也在职位上进行着类似的划分。
他们的区别就像研究动力学的人和设计汽车的人的差别一样,研究动力学的人只负责从研究一些理论,不负责实际的汽车设计,而是由专门的汽车设计工程师来负责根据研究成果进行实际的产品设计。比如对于做搜索引擎来说,研究性人才负责研究检索方面的理论,得出一些公式、算法、理论,然后由开发性人才负责根据这些研究成果写程序,然后变成可以实际使用的搜索引擎。

研究性人才对智商要求比较高,处于人才金字塔的顶端,因此收入、待遇各方面都更高一些,职业发展就是“科学家”;而开发性人才的优势则在于理论转化为产品的能力,因此开发性人才中独立创业的比例更高。

看了公司的职位划分你就能明白白商业化软件开发和写ACM题的区别在哪里了,你就知道做ACM题背景的人和掌握商业程序开发技能的人的不同定位了。如果ACM成绩非常好,那么进入这些国际性大公司的概率会非常高,哪怕去不了大公司,中小型公司也非常欢迎这种基础理论扎实的人才,因为他们可以解决别人解决不了的难题,但是这类人才通常要价比较高,很多中小型公司难以承受,同时中小型公司并没有独立的研究部门,所以这类人才进入公司以后通常都是兼有研究和开发两重责任,当然也是处于公司人才金字塔的顶端,享受特殊待遇;开发性人才则是各个类型的公司都需要的,相对来说选择面广一些,但是初始阶段的收入会比研究性人才低一些。你需要根据你的情况来给自己定位,如果是做研究性人才,那么就继续把ACM弄好,多参加ACM大赛,特别是正式的国际性ACM大赛,争取拿奖,同时做好进行研究生学习的的准备(ACM成绩好的话一般都会被科研院所免试录取),在研究生阶段进行进一步的理论研究和培养自己的科研能力,这种方向的话不需要管什么java
web开发、Windows程序开发这类的实现性技术,只需要把算法、模式识别等理论课程学好即可;如果你的定位是开发性人才则把主要精力放到java web开发、Windows程序开发等上边来,如果从事这个方向,因为你已经有一定的ACM的基础了,所以应付面试笔试中的那些算法难题不在话下,那么就在把一部分精力继续投入在ACM的学习上的同时,把更多的精力投入到这些商业程序开发的技术上去。
至于你提到的“公司为什么要我个大学都没毕业的”,你可以看这几篇文章:
http://www.rupeng.com/index.php/viewthread-514
http://www.rupeng.com/index.php/viewthread-431
http://www.rupeng.com/forum/thread-1211-1-1.html
“一个全国性的营销比赛,这对我找技术方面的工作有优势吗”,你可以参加这方面的比赛,但是不要牵扯太多的精力,这方面的比赛可以提升的软实力,但是同样削弱了你在主业方面的投入;“投过稿,不知道这对你找工作的时候会有优势吗”,这些优势都不是量化的,而是一种软实力,投过稿、写过书,那么你分析问题、表述问题的时候会更加条理化,对工作、个人发展都有好处,这都是软实力的提升,企业需要软实力非常强的人才。

抱歉!评论已关闭.