精华内容
下载资源
问答
  • 如何提高编程能力

    2015-10-18 09:45:17
    如何提高编程能力 一、  1. 扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的...

    如何提高编程能力

    一、 
    1. 扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。 



    2. 丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。 



    3. 最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。 



    4. 不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。 



    5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。 



    6. 多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。 



    7. 良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。 



    8. 韧性和毅力。这也许是"高手"和一般程序员最大的区别。A good programming is 99% sweat and 1% coffee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个 10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。 


    二、 
    什么是研发能力 



    当提到一个软件工程师有很高的研发水平时,我们通常会想到:这个人可能精通C/C++、JAVA、数据库编程、网络编程……等等,软件人员的研发能力就是指精通语言和编程吗?绝对不是!精通这些语言和工具仅仅意味着掌握了一些知识。能力不等同于知识。能力是指掌握了解决问题的正确方法。研发能力就是指掌握了分析、判断、解决、预测技术问题的方法。 



    “知识无用论”最适合描述IT行业技术日新月异的变化情况。也有人讲,做IT行业的人也是吃青春饭的,趁着年轻,尚能不断地学习新的语言和工具,年纪大了,便没有时间和精力跟上技术的变化。 



    这真是技术人员的命运吗?当我们这么想的时候,我们就是还没有真正领悟研发的真谛。当我们仰视国外公司的研发力量时,我们常常自卑地感慨:他们的高级研发人员经验真丰富。他们甚至使用过磁芯存储器和打孔纸带。然而,他们关于磁芯存储器和打孔纸带的经验在今天还有用吗?他们关于BASIC、FORTRAN语言的经验于今天还有用吗?没用,这些经验统统都没有用了。但是随着研发经历的增长,他们的研发能力都在与日俱增。正是这些研发能力使得他们可以被称为高级研发人员,使得他们能够在技术日新月异的IT行业不断研发新的产品。 



    那么什么是研发能力呢? 



    研发能力的5个层次 



    正如知识结构不是一个平面一样,研发能力结构也不是一个平面。研发能力包含以下5个层次: 



    会    对知识点的一般性的、孤立的掌握。这基本上还处于仅仅掌握工具的阶段。大学生或者职业高中生,学过C语言,并做了几个小项目后,可以说会C语言。这时,只要有详细的设计,会C语言的就可以把设计变成代码。会C语言只是结构中的低层次,在网络研发中心,要会的东西很多:网络socket编程,VC++编程,数据库编程,ASP编程,TCPIP基础知识,路由基础知识,广域网基础知识,测试设备知识,PowerPC基础知识,FPGA基础知识……随着我们研发领域的不断扩大,要会的东西也在不断扩大,比如现在我们就需要了解VoIP原理、协议,今后要会的东西将成指数级增长。当然,并不是一个人要什么都会,百科全书式的人物已经没有了。一般一个产品的推出都需要相当多的人员共同配合才能完成。注意到这一点非常重要,下面要讲的能力的各个层次的培养以及综合素质的培养都与此有关系。 



    熟练    在这个层次上,意味着能够快速而有效地完成既定设计。软件代码讲究简洁高效、并且错误率低,可维护性、可移植性好;硬件设计讲究板子稳定、成功率高、成本低;测试讲究快速构架各种复杂的应用环境。我们经常看到这样的论调,说中国人最适合做软件开发,同时我们又悲哀地感慨印度软件业的发达。这是什么原因呢?其实说中国人最适合做软件的论调是不对的,难道中国人的脑细胞都是由0和1构成的吗?更准确的说法是:现在的中国年轻人在现在的教育环境下,最容易在技术上达到熟练这个层次。难道不是吗?从小学一年级开始,每个学生都要把所学的每个汉字、每个拼音字母抄写数十遍,直到熟练为止,数学的考试也是要求精确到小数点后多少位。中国人是很聪明的,学会了一样东西后,很快就能熟练了。 



    分析总结    从“熟练”到“分析总结”是一个很大的变化。分析是从杂乱无章的表面现象中整理出事物的条理,并抓住事物的主要矛盾。软件移植最需要分析能力。移植前,要仔细分析软件的结构,整理出软件的流程框架和主要数据结构,并抓住主要部分,找出移植的关键点。对于新技术、新任务,都要运用分析能力,整理出头绪,抓住关键点。最需要用到分析能力的阶段是:一是学习新技术,新方法时,用华罗庚的话说,就是要把书由厚读到薄,读到薄了,就意味着抓住关键点了;二是需求分析阶段,在这个阶段同样需要学习很多新知识、新概念,要运用分析能力,从众多的信息中整理出自己所需要的东西;三是项目总结阶段,回顾并分析一下所走过的研发历程,总结经验和教训。总结要做到由此及彼,由表及里,由特殊现象到普遍规律,要做到归类、归纳、抽象、概括。 



    全面规划    从“分析总结”到“全面规划”是一个质的飞跃。对开发工作而言,“全面规划”就是“全面规划”。手工作坊式的研发不会感觉到全面规划的重要性。而这正是手工作坊与正规研发机构的关键区别,也是我们中国软件业不如印度软件业的关键点。我们很多研发人员非常愿意用我国改革开放初期的方法――“摸着石头过河”――来做研发。要防止这种倾向的蔓延,要想提高研发能力,要提高研发产品的质量,大家就必须要有壮士断腕的决心来抛弃这个方法。这个方法用多了,不仅影响研发产品的质量和进度,而且更为重要的是,必然会培养思维的惰性,使研发人员不是用大脑在干活而是用手在干活。“摸着石头过河”的方法有时是有用的,我们要非常清楚,什么时候是有用的,这种用法的前提又是什么?绝对不能滥用这种方法。只有两种情况下,可以“摸着石头过河”,一是研究关键技术,二是在用户也不清楚需求时,做原型系统以确定需求。研究关键技术时,不要求对系统做全面的考虑,只需要在关键点上做一些试验,试验完成后,绝对不能把未经全面仔细考虑的试验系统扩充为整个系统,仍旧需要做全面规划。原型系统的开发也是同样的道理,为确认需求这样一个目的建造的原型系统绝对不能扩建为要满足各种指标要求的产品系统。事实上,即使在研究关键技术,做各种试验,以及做原型系统时,也是要求先做全面规划的。只有先设计好了各种试验方案,才能确认关键技术的正确性。 



    趋势运筹    这是更进一层的质的飞跃。不仅了解一方面的技术,还要了解不同技术间的因果关系和相互作用,也需要了解市场需求的变迁。 





    能力的培养 



    “会”, “熟练”能力的培养 



    这里没有什么窍门,一句话,勤学多练,别无他法。不要认为老师授课或者看书才是学习。学习有多种形式,向书本学习,向实践学习,向他人学习。在这两个阶段,重点还是学习知识。 



    “分析总结”,“全面规划”能力的提高 



    IT行业知识变化迅速,在熟练掌握基本知识的基础上,要从学习知识提高到学习正确的做事方法。要掌握“方法论”。分析总结能力、全面规划能力和趋势运筹能力都是在不断融会贯通知识的基础上掌握方法论而形成的。 





    一般来说,分析总结能力还是比较容易培养的,关键在于勤于分析,勤于总结。不偷懒,不要幻想走捷径。不要问题一来,不认真分析,就眉毛胡子一把抓。避免这一点,就能逐渐提高分析总结能力。要特别注意需求分析阶段和项目总结阶段。这两个阶段容易被研发人员所忽视,被认为与技术关系不大,因此不愿意花过多的时间去思考,这对于提高分析总结能力是极为不利的。 



    能力培养的顺序 



    不要在每个层次做横向培养,这样会变成一个知识工人。比如说,做了一年的X25程序之后,想做做路由协议;或者做了两年路由协议之后,想做做帧中继。很多人都想这样每年都做一些不同的技术,这样学习到更多的知识。这种学习的愿望是好的,但行动却是错误的。IT技术日新月异,即使是在路由器、交换机或者网络安全这样专门的产品领域,技术也在不断发展。没有人能够在技术知识这个层次上能够精通每一个方面,我做不到这一点,大学里的教授做不到一点,科学院的院士更做不到这一点。当熟练掌握了一个领域的技术知识之后,必须努力使自己的能力提高一个层次,而不能在一个平面的层次上扩展。否则,每当进入一个新的知识领域,你会显得与新手毫无二致。重要的是,要在立体的层次上提高自己。当然,提高自己的能力,并不意味着不去关注其他相关领域的技术。恰恰相反,由于能力层次提高了,对新知识领域的了解会更多。因为提高了能力,会很容易抓住新知识领域的关键点。从这里,我们也可以看到,研发能力的提高既不是在一个平面上发展,也不是直接不断提高层次,而是螺旋上升发展的。熟练某一个方面的技术之后,开始提高分析总结能力,有了分析总结能力,就能很快了解其他方面知识的关键原理。


    http://lzth.iteye.com/blog/611959

     


    展开全文
  • 作者:Jiecheng Zhao链接:... 如何提高编程能力,这个问题几乎是媒体们采访大神们必问的问题。就我所敬仰的一些大神们(Linus,Yukihiro Matsumoto,TJ,多隆等)的回答都会提到多读...
    作者:Jiecheng Zhao
    链接:https://www.zhihu.com/question/28177315/answer/39739882
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

        如何提高编程能力,这个问题几乎是媒体们采访大神们必问的问题。就我所敬仰的一些大神们(Linus,Yukihiro Matsumoto,TJ,多隆等)的回答都会提到多读源码,当然每个人还会列出其他的一些内容,但是我觉得读源码是十分核心的提升编程能力的方法。(debug其实也是编程能力的一部分,区别可能是需要熟悉一些debug的工具,不过我觉得就题主来说这都是浮云。编程能力本身是核心。等编程能力上去了,读代码的时候读到不对的地方就会感到硌牙,设计模块设计不好就会觉得难受,然后debug自然而然就顺当多了。。。)

        读高质量的源码有什么好处呢? 这和大量的阅读对于写作有什么好处是十分类似的,我想题主作为一个很高阅读量,文字功夫也非常好的人对此应该也是深有体会的。这种好处难以用条条框框来说清楚。套用文学上的说法那叫语感。写代码也有语感。
    创作自己的东西之前首先就是阅读别人创作的东西。多看了高手们是怎么写代码的,试图去理解高手们写代码时在想什么,久而久之(其实也不用太久,两个礼拜细心的读代码就能让能力上升一大截。)自己就会模仿就会慢慢地学会如何像大神一样写代码。等阅读量和写作量积累到一定程度,很多业界所谓的设计规范,模块流程会自然而然的理解并遵照执行,因为这已成习惯。(其实没说的那么自然啦,据传TJ大神是纯看代码流。[TJ Holowaychuk's answer to How did TJ Holowaychuk learn to program?] 正常人会看些书同步补充些规范啊之类的相关知识来帮助看懂代码。)相反如果一开始强套规范,容易遇到瓶颈,那时就只好说,臣妾做不到啊。

    ----------------------------------------------------2/15更新-
    我觉得适合(以学习目的)阅读的代码有一下几个特点。
    1。高质量。比如千锤百炼的基础库。
    2。上下文环境熟悉。在读一个函数或组件的代码之前应该用过它,最好是经常用它,对于它的用法十分熟悉。恩,这也是我首先推荐阅读基础组件库的原因,因为这些总是经常用到的。
    3。不涉及过于专业的知识。基础库很多代码并不适合这一条,特别是为了性能考量,代码中会涉及一些比较难的算法和罕见的处理手段。所幸的是这种东西出来的时候一般都会带上大把注释。开始时候回避一下,后来还是很值得读一读的。是在看不懂的话多读一两篇paper也能搞定,一般注释中都给出线索的。(当然了,有些就变成迷了,比如这段非常有名的代码,就只是留了个很邪恶的注释。 Fast inverse square root。)

    读了代码以后可以做的两件事。
    1。 默写。读完代码以后等感觉基本把细节忘干净了,比如一周到一个月后。像我这种小短脑三天就够了。。。自己把阅读的代码实现一遍。如果实现不下去了,或者觉得自己实现得很丑,就看看原版代码。
    我自己在实践过程中最常碰到的就是模块设计上的障碍,核心的算法往往记得,数据结构也大致记得,但是模块是怎么设计的就忘得一干二净了。写起东西来总是磕磕绊绊的,然后再回头去看“正确答案”,会对别人的设计理解更深一层,发现在美好的设计下那些磕磕绊绊都自然消失了。或者忘了其他什么部分,总之忘了什么就说明缺什么,回头看一下大师的代码就能赶快补上。
    2。翻译。现在很多开源项目的项目介绍中都会写“inspired by balabala”,基本是说我看了某某项目的源码(语言A),然后依着他的框架结构功能在语言B里实现了一套。这件事情其实是十分好的锻炼编程能力的方法,算法、逻辑、设计别人都已经做好了,需要做的只是迁移。迁移的过程中需要对原项目的代码结构有清晰的认识,还需要在现项目中对应的实现,但是对于原算法的理解和一些其他业务性的考量要求却不高(毕竟只要抄就好了)。如此一来,几乎就是集中锻炼了纯纯地编码能力。

    -------------------------------------------------------
    关于debug,我觉得这其实是小事,还有那么多人还在用printf debug呢! 但是也是很烦恼的一件事,很多时候总是觉得debug很不顺手。这里也说一下我的看法。
    debug首先是编程能力的一部分,如果都搞不太清楚程序再干什么又怎么debug呢?如果模块设计很差,算法实现混乱,出错的概率和debug的难度当然会增加。相反,设计的好,编程习惯好,想出错都不容易。
    debug主要有三种工具,debugger(mike zhang 给出的 26.2. pdb — The Python Debugger 是一个很好的debugger工具。),log(print大法),assertion & testcase (可以视为一种工具化再抽象的print大法,其实本质和log没区别)。
    可以从这样一个视角去看这三种工具:
    工具: debugger——log————assertion
    可操作度(对人灵活性): 高————中————低
    表述能力(对机器灵活性):低————中————高
    请按需取用,对于离机器端较远,逻辑抽象度较高的应用,一般会更看重debug时对内部状态的表述能力而不是具体的运行细节。相反离机器端比较近的,逻辑抽象度并不高的场景,一般更喜欢用debug一步一步跟,希望能了解程序具体的运行细节。

    以上仅仅是我个人的理解,实践出真知。各种debug方法都用一下,然后再判断该怎么debug吧。况且实际使用时各类工具是可以混合使用的。

    另外当程序规模渐渐超出一个程序员能力范围的时候,debug有时的确是十分苦恼的,大神也不例外,他们也会抱怨,然后说“我不想再写XXX了”。例如:
    Why should I have written ZeroMQ in C, not C++ (part I)
    Farewell Node.js
    (记得linus也吐槽过linux kernel变得越来越大而越来越难以维护和调试,文章我找不到了。如果有线索的童鞋希望能告知一下。)
    所以当觉得调试很难时请不要灰心。那些说着不干了的大神们后来还是都回到了自己原来的位置。困难总是一时的。

    ------------------------------------------------------
    对于python来说有一步很重要的debug步骤静态类型检查不是python环境自带的。它可以在运行期之前就解析并探知python代码中的类型错误,十分有用。可以减少很多的麻烦。
    现在比较好的工具如下。
    Sourcegraph
    github.com/yinwang0/pys

    ------------------------------------------------------

    然后就如同教别人怎么读书一下,现在应该写推荐书目了:
    先弱弱的问一句除了python还会什么?一般而言读源码我会先推荐别人当前语言的标准库,先从二分搜索和排序开始看起。这两个算法几乎每个语言的标准库中都有,它们是将逻辑本质从事物本身表象中解耦的典范,而且除了语言本身以外它们对其他知识和上下文语义的依赖很小,十分适合作为最早的读物。很可惜的是python的这部分标准库是C写的,所以并不能靠读这些立杆见影地提高python的编码能力。(当然那些C代码也很有价值,特别是python的排序实现,很精彩,后来被java啊,octave啊,gnome啊都抄了去。其实编程能力总是相通的,读了对python还是很有好处的。)入门"书籍"都不知道推荐什么,真让人团团转。(我猜其实题主既然是用python在做机器学习,应该底层实际接触的还是C。其实cpython的标准库也可以读~~)

    恩,推荐"书目"之前我能问一下题主的编程水平吗?
    比如写过多少代码。然后看看这里Problems | LeetCode OJ的题目,用python做一下感觉如何?(这里的题目也很好,做做也是很好的提升代码能力的途径。)描述一下,然后我帮你找找看合适的阅读材料。其实我觉得呐你只要双手一摊问你导师要他的代码或许就可以了,虽然程序写的最漂亮的还是那些大师级的程序员。

    啊对了,光读不练是不行的,如果追求高强度,高效,那就请刷题吧。题主坐拥世界上最好的计算机教育资源,我这里就不献宝了。



    就把码代码当做写作,我相信题主你可以的!
    ========================================
    为表对cpython TimSort 的景仰还是贴点连接:
    cpython: 99302634d756 Objects/listobject.c
    bugs.python.org/file445
    TJ 是node社区代码贡献第一的男人,代码质量高产量高。以下是他回答他是如何学习编程的。
    TJ Holowaychuk's answer to How did TJ Holowaychuk learn to program?
    展开全文
  • 有干货、更有故事,微信搜索【编程指北】关注这个不一样的程序员,等你来撩~ 前言 开局两张图,剩下全靠吹了。 上面这两张图便是写这篇文章的原由。 对话框的另一边,是一位大二计算机科班在读的小姐姐,看似平静...

    有干货、更有故事,微信搜索【编程指北】关注这个不一样的程序员,等你来撩~

    聊天截图

    聊天截图

    前言

    开局两张图,剩下全靠吹了。

    上面这两张图便是写这篇文章的原由。

    对话框的另一边,是一位大二计算机科班在读的小姐姐,看似平静的文字背后透露着迷茫与困惑,还对未来的焦虑。

    透过屏幕,似乎看到了大一时的自己,不会装环境、不知道怎么编译,报错也不会解决,更不知道除了计算水仙花数、打印乘法口诀表…还能写些什么。

    感同身受让我觉得有必要认真的好好回答一下(其实是因为这是小姐姐问的😝,也算是对大一时的自己一个隔空对话。

    做公众号短短这一个多月,我在后台看到过不少类似问题的,每次看到学弟学妹们这样认真又略带迷茫的提问,其实是比较有压力的。

    怕自己不能够站在他们的境地去思考问题,搞成了「B」乎似的回答,也担心自己的回答不能帮到他们,甚至在某些方面对他们产生误导。

    所以一般我都是选择回答比较政治正确的那种,比如:

    “加油,你要多去实践,xxx”

    “嗯嗯,你要多去看书,balabala”

    “刚开始都是这样的,你多坚持一下呢,xxx”

    怎么说呢,这都是正确的废话,谁都知道要多看书,要实践,要去动手写代码。

    有时候想回答得更细致一些,但是迫于各种原因,也没时间去挨个的回复。

    但这次学妹特地打了很长一段字,我看到了她想要快速适应计算机学习却又不得其法的迷茫,也许我的回答会对她有所帮助呢?

    因此我让她描述得更加细致一点,也很好针对性的提出一些建议。

    不过首先申明下,本文主要是以回答学妹的问题为主线,面向的对象是大一、大二以及自学还未找到合适的学习编程方法的同学。

    如果你已经有了自己的一套方法论,或者说已经工作了,那本文对你几乎没有参考价值,建议直接拉到末尾点个赞~

    可能有小伙伴没细看聊天截图的内容,我在这里再贴一次学妹的问题:

    下面是我抽出来的一些问题:

    1、只会像高中一样跟着课程学习

    2、怎么可以脱离课本和教学视频自己编写一个小项目?

    3、停于理论,不知道如何实战

    4、就算跟着教程安装软件,搭配环境几乎每一步都会有这样那样的错误

    5、知识遗忘得快,理论没有形成体系,自己计算机的学习只局限在刷了一些慕课上的题,做了学校要求的实验

    6、学完一门课程不知道能干什么

    7、畏难情绪严重

    8、焦虑、担心找不到工作

    首先,看似抽出了很多条的问题,但是我把所有问题都归为一个,那就是 「如何提高编程能力」

    只要编程能力、实战能力提高,上面一长串的问题自然也就不成问题了,更不用担心找工作的问题。

    所以今天就来聊聊如何提高编程能力这个话题。

    要说提高,总得先明确下什么是 「编程能力」 吧~

    到底什么是编程能力

    经常能看到大V、前辈们说,你要多写,要多练,提高自己的“编程能力”,但是编程能力到底是什么呢?

    在我看来啊,所谓的编程能力其实说到底就是用代码解决问题的能力,无论是 Leetcode 上的还是现实世界的问题。

    能够从问题本身或是业务逻辑提炼出解决方案,并且用代码去实现,编程就是在干这样一件事:

    现实世界的问题 -> 抽象出解决方案/建模 -> 计算机语言表达

    可以看到,写代码只是最后一步,而我们常常说自己不会写,真的是不会写代码吗?

    这让我想起了以前英语老师说的:

    “很多同学说英语作文说写不了几句就写不下去了,但是真的是英语学得差吗?我看未必,大概让你用中文写,也写不上几句”

    是啊,英语作文写得不好,很多同学下意识的觉得是自己英语本身没学好,确实有这个原因。

    但是更本质的原因或许是你语言表达和组织能力的问题,也就是让你用母语写,也不一定能有条理的写上一段文字。

    那回到编程这里,不会写代码,也许是你连解决问题的思路都没想明白,就是说你的脑海里没有形成「第一步该做什么,第二步该做什么」这样的流程。

    这其实是最重要的,编码实现反而是相对简单的事情。

    很多大厂,一般都是高级工程师或者架构师进行领域设计、架构设计,初级工程师进行编码实现各种接口。

    说到这,我又想起了最近工作上的事情。

    由于时间紧迫,我被 leader 安排去了支援隔壁部门开发,但是他们那里的很多业务背景我一点都不知道。

    对方对接的人让我去模仿 xxx 模块写,我看了 xxx 模块两天,愣是没写出个啥来。

    事后,我在想,为啥会这样呢?是我编程能力太差吗?

    也许是吧,但是更重要的原因是,我不理解业务背景,所以我的脑海里没有要实现这个需求的流程图.

    检查参数、鉴权、认证、签名… 这些流程不清晰,表现出来的形式就是,我不知道代码到底该先调哪个接口,再做什么。

    心中没思路,自然无从下手。

    所以其实编程的核心就是,你需要在心中对整个实现流程有一个大致的思路,然后用代码去一步步的实现。

    在实现过程中,你会遇到很多细节问题,比如数据结构的选择,用 set 还是 list,存储结构的选型,以及如何 bug free的实现。

    更进一步,怎样写出高性能、易读、易维护、易扩展高质量的代码,当然这都属于编码能力了。

    如何提高编程能力

    嗯,我回过去看了自己上面的一翻分析之后,我觉得…分析了个寂寞,说的太尼玛抽象了,我 TM 就想知道到底怎么提高编程能力!

    好,接下来我就具体一点,不搞这些虚头巴脑的东西了。

    提高编程能力,我自己总结了以下几点:

    • 多实战,做项目,用需求倒逼输入
    • 善用工具,尤其是搜索引擎
    • 看优质资料,特别是经典的计算机书籍
    • 养成自学习惯,提高自学能力
    • 看一些小而美的源码

    来,先上第一点,关于做项目,这也是学妹的痛,不知道如何去开始一个项目。

    谈到这点,对不起,我又想讲自己的经历了,有点长。。。

    一、实践

    learning by doing

    是的,我们都知道编程是一门实践的学科,不动手永远学不会,看懂了和学会了之间差了上万行代码。

    或者说:
    看懂了 + 上万行代码 = 学会(此公式未经证明,纯碎自己拍脑袋想的

    刚学完一门语言,想必大家都想做点有用的东西,而不是天天写练习题,但是呢,又不知道从何下手,尤其是 C 语言。

    我大一上完 C 语言课,就处于这种状态,但是我隔壁一个室友就不一样的。

    他在学习 C 语言的过程中,刚学到动态内存分配(malloc),就去摸索着写贪吃蛇、坦克大战,而且完成度都挺高的,那时候是我们眼里妥妥的大神。

    但是大神和我上的课,学的东西都完全一样呀,况且都是上了大学才开始接触编程,为什么差别这么大呢?

    以至于那时候,我和学妹一样,常常怀疑自己没有编程天赋,觉得别人天生就是这么强。

    这种状态一直持续到大一下,那时候刚学完 Java,而 Java 也比 C 友好了不少,所以总想写点什么。

    于是自己就选择写一个类似 QQ 的聊天工具,其实功能就很简陋,就是一个简单的 GUI + Socket 编程,然后在加上用户信息管理就完了。

    但是,当我用这个简陋的软件,分别在室友和我的电脑上跑起来并且成功发送消息的那瞬间,我觉得我的编程世界被点亮了。

    原来编程这么好玩,原来我也能做一些有趣的东西!似乎找到了一丝编程的感觉,但还说不上到底是什么感觉,毕竟这个程序总共也就几百行。

    紧接着,趁热打铁,我又写了一个联机五子棋,实现上依然是 GUI + Socket 传输数据。

    但是写这个又遇到了不同的问题,比如棋盘在我的实现里是一个 N*N 的数组,棋子是用对象表示,对象里有坐标、颜色这些属性。

    当时我就疑惑了,当一方落子后,该怎么把棋子对象通过网络传输给对方呢,再从网络接收的数据恢复到对象?

    起初自己的想法是手动的把对象转换成字符串,然后像聊天工具一样发送给对方,比如:

    {x: 12, y: 13, color: black .......}

    这种做法没问题,但是总感觉不够优雅完美,于是上网一番搜索之后发现,原来我想的这个就叫「序列化」和「反序列化」。

    并且在 Java 里直接实现 Serializable接口就好了,甚至可以直接使用ObjectOutputStream类就能完成序列化和反序列化对象。

    这些问题在现在看来,根本就不是问题,更像是“常识”。甚至序列化这块,还会选择一些兼容性更好、性能更高的协议,比如 Protobuf、Thrift、Avro 等等。

    但是对大一时的我来说,在这个过程中不断的遇到问题并且去解决,就是实打实的编程能力上的提高啊。

    在我解决掉一系列问题之后,顺利的和隔壁室友用自己写的联机五子棋对战了几局,这个五子棋还支持不少诸如悔棋、暂停、自动判断输赢等功能。

    界面风格和下面这个很相似(这是网上搜的)

    Java版五子棋

    但是由于当时没有存 Github 的习惯,代码在换电脑之后没能留下来。

    通过写这些项目,我像打通了任督二脉一样,不是学了什么厉害的算法、也不是高深的设计模式、更没有分布式这样高级的东西。

    那是什么呢?

    我感觉到编程就好像搭积木一样,基本的函数、库、组件就是一个个的积木块,写的代码就是胶水。

    只要我们心中有设计图纸,那就能通过胶水把这些积木搭建成想象的模样,缺少什么积木块,用到的时候再去搜索就行了。

    在程序的世界,只要你想,你就能。

    这段时间大概是我编程能力提升最快的一个阶段之一。

    关于这个五子棋,还有个小插曲:

    我写的不是联机五子棋嘛,然后启动的时候输入对方的 IP 和 Port 就能连上对战。

    后来,我找了一个在其它城市上大学的高中同学,让他和我一起玩五子棋,但是呢,我傻乎乎的让他用 ifconfig 查看自己 IP 后告诉我,然后我在这边连接。

    那个 ip 呢,大概长得像 192.168.1.xxx,熟悉的同学都知道,这个就是局域网内使用的 IP 了,并非公网上的 IP。

    局域网内的 IP 只能在内网才能使用,所以我用这个 IP 是永远连不上的他的电脑的。

    但是那时候我才大一,没学过计网,根本不懂这里面的原理。

    为啥我和室友能连上呢(因为在一个局域网)?为啥和其它学校的同学就不行?

    别看现在这个东西在我看来是常识,但我那时候是一点计网知识都没,就是硬着头皮学的 Socket 编程,去理解 IP 和 Port。

    那是怎么解决的呢?

    当然是找谷歌呀!

    在网上一番查询后,大概明白了,如果想让不同局域网内的主机进行 P2P 通信,需要一个公网中转服务器辅助进行 NAT 打洞。。。后来,我就又去尝试 NAT 打洞了,其中细节就不再描述了。

    其实把我个人编程经历上写这么多,就是想展现我是如何一步步去实践的,遇到了什么问题,又是怎么解决的,把这个过程展现出来。

    你看我没学任何计网知识,还不是通过边学边用,完成了网络相关的项目。

    所以你离项目只差一个开始。

    说到这里,不少同学又会说,我知道要多实践、多动手,道理我都懂。

    可我还是不知道如何开始去写一个五子棋、贪吃蛇之类的东西。

    好,那我就要问问你了

    小北:为什么你学了 C 语言还是不会写贪吃蛇呢?

    学妹:老师没教我贪吃蛇如何在 C 语言中表示,也没教我如何让画面动起来,更没教我如何绘制 GUI ,所以我不知道怎么做。

    这应该是大多数同学最典型的问题吧?

    那我们以贪吃蛇为例拆解一下,看看是如何从问题到代码的。

    首先,贪吃蛇是一个个的节点组成的,节点肯定有横纵坐标吧?一个个的节点组成了一条蛇,那自然应该想到链表吧?

    蛇还有什么属性?当前移动的方向

    还要食物位置吧?
    那这些属性在 C 语言中用结构体表达出来就是这样:

    typedef struct node{
     	int x;
    	int y;
    	struct node* next;// 单向链表
    } SnakeNode;
    
    typedef struct snake {
    	SnakeNode *pHead; // 蛇头
    	SnakeNode *pFood; // 食物
    	int direction;		// 方向  0-3 依次表示:上、下左、右
    	...
    }
    
    

    接下要考虑的就是如何去绘制蛇,这个简单呀,就把整个链表从头开始把每个节点打印出来。

    每个节点可以是一个圆点,也可以是方形。

    那如何让蛇动起来?所谓的动,其实就是不断的将蛇打印出来,然后又清除。

    并且不断的根据移动方向更新蛇的位置,只要这个过程够快,快过人眼能够分辨的帧率,那看起来蛇就像是在连续的动一样。

    然后这个过程你还要去考虑如何检测碰撞,如何判断吃到了食物,还要随机产生食物。。。
    这些东西首先你得想清楚逻辑,代码实现其实if、else 、for 就足够了。

    做项目的过程总会遇到不会的东西,也会遇到问题。

    但是要相信,所有的问题在你之前基本上都已经有人遇到过了,只需要把问题准确的描述出来,然后去搜索引擎上搜就肯定能找到解决的线索。

    如果你要等学会所有东西,才去开始做项目,那估计等到本科毕业也没机会。

    本科上的就那几门课,Java/C/C++、操作系统、计网、编译原理、离散、数据结构…

    可能没有学校会单独开一门课教你 Java Web、Python 写爬虫等等。

    学完这些理论课,等到毕业,你会发现,依然好像什么都做不了,所以说,要动手,趁早。

    并且理论上,学完一门语言,掌握了数组、链表、 if、for、函数这些编程最基本的概念,就有能力去实现一些诸如贪吃蛇、五子棋、扫雷这样的小玩意了。

    这种通过项目去学习,以解决问题为导向的学习才是更加精准和高效的。

    课堂上的学习大多数是老师灌输知识、学生记住,然后考试就能拿高分。

    实际上有多少知识能转化为解决问题的能力呢?

    不好说。

    还是那句话,编程就像搭积木,学完基础的,积木块都给你了。

    你能搭出房子、车子、还是火箭这全靠自己。

    二、善用工具、学会搜索

    学会用工具,更要用好的工具。
    什么是好的工具?

    诸如 VSCode,Github、Stackoverflow、Google、知乎、Jetbrains 全家桶都是不错的编程工具,有的提高生产力,有的能解决问题。

    都 2020 年了,就不要在机房装着 VC6 写练习题了。

    不要等到大一结束了,还没上过 Github,更不知 issue、pull request 为何物。

    计算机专业的学生,如果还在用百度搜索技术问题,送给你一段陈皓(左耳朵耗子)前辈的话:

    coolshell截图

    当然,在没法使用谷歌的情况下,百度还是可以用的,但是这对计算机专业的同学,不应该是一个问题。

    很多时候,你把遇到的问题准确的复制到 Google/Stackoverflow 搜索框,大概就能找到答案。

    而百度会将你带向培训班的课堂,嘿嘿,刺激不。

    3. 看优质资料

    现在处于信息大爆炸的时代,互联网上充斥着各种博客、学习资源,这是对学习者最好的时代。
    但是资源太多,就存在一个选择的问题,在这里我给你几个建议:

    1. 把网盘里屯的那 500G 视频/资源 删掉,你永远不会去下载来看的

    正所谓,收藏从未停止,学习从未开始,当你不再习惯的收藏资源了,你就成长了。
    最好掌握获取/搜索资源的方式,自己需要什么资源再去搜就完了。而不是让资源白白的占据你的网盘。

    1. 当需要学习某个东西的时候先去知乎/Google 搜索 「xx学习路线」

    然后根据高赞/优质回答,选取大 V 们都提到的资源,这大概是这个领域比较经典的,然后去搜集资料,开始学习。

    B站、mooc、网易公开课、Coursera等视频网站上有很多优质免费的课程

    答应我,不要再被那些关注送 500 G 学习资源的骗了好吗?资源都在网上公开着,直接打开 B 站就能看,不香么?

    学应用框架,官方文档是最适合入门的,并且很多都提供了「快速入门」的指引

    比如 Vue、Hadoop、Requests 这些官网的指引都非常的清晰易懂,真的不要再去看七零八碎的博客,博客的定位应该是补充。

    少看博客,多看书

    很多博客其实就是博主自己读完书,然后复述一遍的笔记,你再去看他的博客那就是等于学二手知识,他的高度就决定了你的高度。

    当然有些优秀的博主能够概况性的总结,或者把某些原理讲得特别清楚,这是值得看的。

    总的来说,系统性的看书是你成长最快的方式。

    四、自学

    大学的学习,学的绝非是仅仅的知识,最应该学会的能力是「自学」。

    等走上工作岗位的时候,你便会发现这个能力有多么重要。

    初入职场,在公司,没人会像学校里的老师那样,手把手的教你。

    就算有安排导师,也是扔给你一堆的文档和资料,自己去学习,然后开始上手实际项目。

    这个过程大多会比较痛苦,至少我这几个月是这么过来的。

    说到这,我突然想说下我认为的「自学的能力」,因为在程序员这个群体中,不管是科班学生还是野生程序员,自学都是必不可少的。

    那「自学的能力」又到底是什么呢?

    我个人体会有以下几点:

    1. 明确你学习的目标,比如我要学 Java Web、IOS 开发、机器学习等等

    2. 了解该领域包含了哪些子模块,比如 Java web 需要学 Java 语言基础、JVM、数据库、计算机基础等

    3. 掌握这些子模块的学习顺序和依赖路径,也就是先学什么,再学什么

    4. 搞清楚这个方向有哪些入门、进阶的学习资料

    5. 按着学习路线,开始学习一个子模块

    上面这个过程,不断的递归下去,直到拆分出一个比较小的学习目标。

    比如我要学 「Java web」,那这里面可能包含了Java 基础、Netty、JVM、Spring、MySQL、Redis 等等。

    那 Java 基础又可以进一步分为 基础语法、面向对象、异常、集合、IO、反射等。

    分到这里,你就可以开始去找资料学习了啊。

    比如先安装 JDK,然后写 Hello World,然后慢慢开始刷书或是刷视频…

    五、看小而美的源码

    这里我用了一个定语「小而美」,小是指代码量少,最好就几千行,这样我们能够充分把控,美则是指代码实现写得很优雅。

    我们都知道提高审美能力很重要的一环就是多看美的东西,好的设计。

    那写代码也是一样的,自己学完基本语法,写出来的代码大概停留跑起来的水平。

    这时候去看看大佬写的代码,你绝对会惊呼 卧槽,还能这样?

    这样的代码有哪些呢?

    如果你是大一的同学,我推荐你去看看 Linux 内核中关于链表的实现,简直特么太妙了,平常我们定义链表不都是这样嘛

    struct Node {
       int data;
       struct Node* next;
    }
    

    但是这个存在的问题就是,每个想用链表存储的结构体,我们都得去写一遍,遍历、插入、删除的逻辑,显然太low了。

    那 Linux kernel 中就用宏,在对用户自定义数据结构侵入性很小的情况下,实现了其它语言中模板的功能。

    相信我,看完,你会学到很多骚操作的,后面找机会写一下这块。

    又比如学完 C 语言,你会不会觉得 C 中的字符串有点不灵活,那推荐你去看看 Redis 中关于动态字符串的设计–SDS。

    这些代码都不长,也不难理解,但是看完对于提升我们的编码能力是有很大帮助的,这就是小而美。

    提倡看源码,不是让你直接上手就啃什么 Nginx、Sqlite、Redis的源码,这些都是几万级别的代码量,一般初学者

    即使要啃,我给你说个好办法,这些东西目前来看,代码量都是几万几十万的级别,有点不友好,你可以去 github fork 下来。

    然后回退到第一个 commit,从第一个 commit 开始看起,看到第一个完整的版本。

    这个过程也是能学到不少东西的,看看罗马都是怎么建造成的。

    解答问题

    好了,BB了一大段假大空的东西,最后再回到学妹具体的问题上,挑几个来具体问题具体分析:

    一、只会像高中一样跟着课程学习

    说到底,还是填鸭式,没有形成自己的目标和学习路径。

    如何破局?

    最简单的方式,给自己定一个目标,或者我给你定几个,自己领一个:

    • 学习前端开发,目标 BAT
    • 学习 Java 后端开发,目标 BAT
    • 做 Linux CPP后台开发,目标 BAT
    • 保研/考研,目标 985 或 C9
    • 算法岗…不建议,太卷了
    • 大数据开发、数据分析等等

    如果你做技术岗,上面这几个基本覆盖了应届生找工作的主要岗位,你选一个自己相对喜欢一点的。

    至于如何去达到目标?

    当然是分解,然后去找 Google 呀,去看看 BAT 这些岗位需要点亮哪些技能,怎么学才能达到。

    记住,目标、目标、目标!!!

    没有目标,你的生活就会是得过且过,满足于上课、做作业、考试、绩点这样的循环。

    到了毕业找工作,你会发现面试官好像都不怎么关注你的绩点有多高,他们更关注你的基础知识和解决问题的能力。

    解决问题的能力怎么体现?

    可以是刷题或者是让你讲你参与的项目,以及在这个项目中你扮演的角色和遇到了什么题,又是怎么解决的。

    我们会发现,那些优秀的人,无一不是有着清晰的目标,从现在开始给自己定一个目标吧!

    二、怎么可以脱离课本和教学视频自己编写一个小项目?

    初学者跟着视频做是很有帮助的。

    先跟着课本或者视频完成一个项目,记住不是看视频里的老师完成,而是你自己要跟着完整的敲一遍!

    第二步,不看视频,根据自己脑海中的流程、思路来逐渐编码,明确先做什么,再做什么。

    第三步,改造,或者基于视频里的做一个类似但不同的项目,比如视频里写的商城,那你可以自己做个论坛,视频里是贪吃蛇,你可以自己做个坦克大战,诸如此类。

    其实这就是学自行车嘛,先用借助辅助轮或者别人扶着练习,然后慢慢的下掉辅助轮,自己骑。

    千万不要没学会走,就想跑了,这样会摔得很惨。

    三、就算跟着教程安装软件,搭配环境几乎每一步都会有这样那样的错误

    这个问题,百分之 99% 的同学肯定都遇到过,甚至现在,我安装一些新环境的时候也会有各种问题。

    想起刚学 Java 的时候需要去配置 Path、ClassPath、环境变量这些,但是第一次接触根本不知道配置这些的作用,也不知道他们的原理。

    就跟着博客教程一步步执行,但是经常就会发生,明明都照着来了,还是跑不通。

    那这个时候怎么办呢?

    第一办法是重新搜索尝试不同的教程,这个其实是换汤不换药,能不能配通还是看运气

    第二个办法就是去搜为什么要这样配?

    了解之后,你就明白 Path 就是指定了我们平时在终端使用命令的搜索路径,ClassPath 则是让 Java 执行环境找到指定的 Java 程序对应的 Class 文件以及程序中引用的其他 Class 文件。

    当你去了解这些东西之后,再去看博客的配置步骤就不再是懵的了。

    在不了解背景的情况下,我们只能根据别人的指令一步步走,害怕和被人有一丝的不一样,而导致最后配置失败。

    但是当你了解了原理之后,这些博客就只是参考了,你甚至还可以考虑到你和博主的某些环境是不是有差异,这些差异会对应到步骤中哪里应该采用不同的配置。

    这个其实我体会特别深,在我第一次用到 CMake 的时候,起初,我是去抄别人的 CMakeList.txt 文件。

    但是当我需要增加编译依赖或者其它定制化的时候,我就懵逼了。

    include_directories、include_directories、target_link_libraries 这些指令,不知道如何去组合达到自己想要的目的。

    那我当时是去找来了 CMake 的教程,浏览一遍后,我便懂了 CMake 构建的原理,以及各个指令的作用。

    这时候,我便有能力基于别人的 CMakeList.txt 去定制化。

    这就是我个人认为「搭配环境几乎每一步都会有这样那样的错误」的内在原因和解决办法了。

    一句话,你是否清楚你所看博客做的每一步操作是在干什么,如果不明白。

    只是复制别人的命令,那出错了,肯定会懵逼的。

    四、 知识遗忘得快,理论没有形成体系

    不知道学妹这里说的遗忘得快的知识是指什么?

    我说一下我的看法吧,我在不同文章中都反复提到了,学习新知识要学会抓主线,把零碎的、非本质的东西浏览一遍就行,用到的时候知道去哪找,这就够了。

    我在万字长文 | 这可能是东半球最保姆级的后台服务器开发学习路线中也提到过各个学科的主线是什么,这里再啰嗦一遍,比如计网,你说你把 CRC(循环冗余校验码)的计算方式忘了,这就是遗忘吗?

    对不起,我也记不住,也完全没有必要去记。

    计算机网络的主线是「两台主机之间的数据包是如何通过网络传输给对方的」,其它的,像 UDP 的包头的构成呀,SMTP 使用的端口号呀 之类的问题,看一遍,有个大体印象就行了。

    但是你得知道 UDP 包头里有源端口和目的端口以及数据包长度,为什么呢?

    因为这个是靠理解,反推出来的,首先 UDP 是传输层协议,传输层的目的是区分同一主机上的不同进程,那么一定是需要一个标识的,这就是端口号。至于它们是怎么排列的,这丝毫不是关键。

    上面这段话,抛砖引玉的聊了下我认为什么知识是可以遗忘,什么是不可以遗忘的。

    那不能遗忘的知识也遗忘了怎么办呢?

    多看。多去思考这样设计背后的原理,多问自己「Why」。

    至于理论没有形成体系,其实我也存在这个问题。

    但是我想的是,量变引起质变,你先积累足够的各个领域的知识,总会有打通任督二脉的那一天。

    才开始学,怎么可能有完整的知识体系呢,至少到了大三、大四再来考虑知识体系这个问题。

    五、畏难情绪严重,担心找不到工作

    畏难这个事,老实说,人人都会有,我也不例外。

    不要想着去克服它,畏难其实和喜欢舒适区差不多,这大概是天性吧。

    除了天性使然,还有一个原因是想得太多,做得太少,还没开始做呢,就去想各种后果了,进而产生一系列奇奇怪怪的想法,自己吓自己。

    那克服畏难情绪最简单方法就是行动,立刻行动起来,去分析一下,要做成这件事,需要哪些资源、前置条件等等

    行动是缓解焦虑的最好方式,这真的不是鸡汤。

    至于担心找不到工作,这完全没啥好焦虑的呀,你按照上面说的去制定目标,学习,找工作就是一件水到渠成的事。

    当然了,最重要的嘛,持续关注编程指北~

    END

    不知道这篇文章有没有解决学妹的问题,但是我已经算是把我能想到的,用我觉得最合适的方式表达出来了。

    剩下的还要靠学弟学妹们自己去摸索了,毕竟,看别人的总结再多,不如自己亲身体会一次记忆深刻,毕竟纸上得来终觉浅。
    至于学习资源的推荐,我考虑单独出一期~

    写这篇文章的目的也不是传道授业,而是解惑,希望我的一点经历和心得的分享能够对后来的同学有一丝的启发,让他们少走弯路。

    这便是这篇文章最大的价值所在。

    絮叨

    最近好像很久没写技术文了,全在写这种水文,大家是更喜欢看技术文章呢,还是这种类型的呢?

    评论下,让我了解下呗,不过无论如何,接下来几篇都是技术文章了。不能一直这样水下去了哈哈哈

    我是小北,乾坤未定,你我皆是黑马,咱们下期见!

    文章持续更新,全文首发自我的个人公众号,可以微信搜一搜「 编程指北 」第一时间阅读,后台回复【pdf】有我搜集的上百本经典的计算机书籍电子版。

    展开全文
  • 今天我就来带大家一起解锁一款程序员必备法宝,帮你轻松提升编程能力,离大厂更进一步。 众所周知,刷题是程序员提升编程能力的最快方法,所以拥有一款靠谱的刷题神器至关重要。! 如上图所示,我们可以看到此刷题...

    俗话说得好,不想进大厂的程序员不是一个好程序员。那么作为即将步入程序员大军的小萌新/程序员界的老司机,你们都是如何备战大厂的呢?是否面对网络上纷繁复杂的资料茫然无从下手?抑或是坐在电脑旁埋头敲着代码却找不到一丝存在感?不用怕!今天我就来带大家一起解锁一款程序员必备法宝,帮你轻松提升编程能力,离大厂更进一步。

    众所周知,刷题是程序员提升编程能力的最快方法,所以拥有一款靠谱的刷题神器至关重要。
    !在这里插入图片描述

    如上图所示,我们可以看到此刷题神器将题目分为了容易、中等、困难三个等级,这样,大家就可以根据自己的当前水平选择对应难度的题目,由难到易逐个击破,极大地提升了我们的学习效率。此外,我们还可以通过标签来选择对应知识点的题目,在做题中掌握各个知识点的出题规律和类型,同时也加深了对知识点的理解,全方位地夯实自己的基础。

    然而,看到这里肯定还有人疑惑:此款刷题神器虽好,但总感觉少了点什么。这样天天对着电脑一个人默默刷题也太枯燥了吧,慢慢就会丧失学习的激情。想要激情?别担心!该神器还贴心地为大家准备了专业的编程赛来激发大家的学习热情。

    告别传统的封闭式刷题模式,有趣又新奇的玩法,让你彻底爱上编程!

    此次在线编程大赛涉及范围广,难度不高,入门级算法赛(可参考LeetCode或九章算法),支持Java、Python、C++、JS、Go等多种语言,不管你是高校的学生还是社会人员,只要你对编程感兴趣,想提升自己的编程能力,都可以报名参加比赛。本次比赛与九章算法合作,确保了赛题的专业性。这么牛的比赛,参加完还怕找不到好工作吗?

    参加比赛不仅可以激起你学习的热情,提升你的编程能力,还可以赢取高达20000的奖金,入围复赛就可以得到纪念T恤一件。现在还可报名模拟赛,额外赢取樱桃键盘、SKG颈椎按摩仪、付费课程等超值礼品。普通的刷题千篇一律,有趣的比赛奖金上万。
    报名入口
    活动时间:2020年7月20日-2020年9月17日
    在这里插入图片描述
    在这里插入图片描述

    Get 同款刷题神器请点击 在线编程

    展开全文
  • 大家应该都知道欧阳修的《卖油翁》的寓言小故事,油翁说的那句“无他,唯手熟尔”,不仅适用于康肃公的射箭、油翁的倒油,也适合新手编程。 我上大学的时候由于老师水平太菜的原因,编程其实学得一塌糊涂。这里多说...
  • 一、聊聊编程能力 编程能力是一个比较大的概念,是利用计算机编程语言实现软件开发的能力的统称。这个能力主要包括逻辑思维,学习能力。编程能力是软件开发者的软实力,可以灵活应用到其他任何地方。 “从上向下”...
  • 如何提高编程能力

    2018-03-24 15:35:00
    其实很多人学编程都会遇到困难,我觉得其中一个根本原因是他们没搞明白学编程到底是学什么。 编程不是一种知识,而是一门手艺。 我们从小到大的学习都是学习知识,流程一般是课前看书预习,上课听讲,下课做作业,...
  • 适合初学者!教你如何学习编程!!看看吧!!!
  • 我一直在学c语言,之前一直在做poj。已经做了不少了,现在不知道应该怎么做才能继续提高编程能力?哪位大神给点意见啊?菜鸟比较迷茫。
  • 如何提高编程能力 嗯,我回过去看了自己上面的一翻分析之后,我觉得......分析了个寂寞,说的太尼玛抽象了,我 TM 就想知道到底怎么提高编程能力! 好,接下来我就具体一点,不搞这些虚头巴脑的东西了。 提高编程...
  • 小弟自学编程几个月了(C#.NET),有些编程基础,自己可以写一些小的算法,或者解决一些相对简单的问题。 但是,在遇到一些比较复杂或相对规模较大的问题的时候,总是不能很好的定义类型,算法结构也很混乱。经常写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,243
精华内容 497
关键字:

如何提高编程能力