编程学习

(6条)09-21? &
(13条)09-21? &
(4条)09-21? &
(4条)09-21? &
(4条)09-20? &
(8条)09-20? &
(5条)09-19? &
(6条)09-16? &
(8条)09-14? &
(4条)09-13? &
(13条)09-09? &
(9条)09-09? &
(5条)09-08? &
(4条)09-08? &
(4条)09-08
编程中国 版权所有
Copyright (C)2004 - 2016, BCCN.NET, Inc. All Rights Reserved酷勤网 C 程序员的那点事!
当前位置: >
> 文章列表
Mysql性能优化二
建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千倍,这可真有诱惑力。可是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为...
时间: 23:25
来源: 博客园
Mysql性能优化三(分表、增量备份、还原)
对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了。如果我拆成100个表,那么每个表只有10万条记录。当然这需要数据在逻辑上可以划分。一个好的划分依据,有利于程序的简单实现,也可以充分利用水平...
时间: 23:23
来源: 博客园
那些著名或非著名的iOS面试题-中编
1. 反转二叉树,不用递归 /** * Definition for a binary tree node. * public class TreeNode { * * TreeN * TreeN * TreeNode(int x) { val = } * } */ 递归方式: public class Solution { public TreeNode invertTree(Tr...
时间: 23:22
来源: 简书
Java 并发编程:核心理论
并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。本系列会从线程间协调的方式(wait、notify、notif...
时间: 23:22
来源: 博客园
那些著名或非著名的iOS面试题-后编
1. Runtime Objective-C 是面相运行时的语言(runtime oriented language),就是说它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。这就给了你很大的灵活性,你可以按需要把消息重定向给合适的对象,你甚 至可以交换方法的实现,等等。 RunTime简称运...
时间: 23:21
来源: 简书
一、Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synch...
时间: 23:18
来源: 博客园
为了在App Store上更突出自己App的核心功能,我们可以通过上传预览视频 尝试视频讲解 这期我们拿 支付宝 来做演示,一种另类动画制作; 在以往我会通过写Blog去讲解自己的一些经验和技巧,这期我采取录视频来锻炼自己的讲解能力,望大家多多包容我的不足。...
时间: 23:18
来源: Art's IO
1. 初始化 大致单步跟了下Spring IOC的初始化过程,整个脉络很庞大,初始化的过程主要就是 读取XML资源,并解析,最终注册到Bean Factory中 : 在完成初始化的过程后,Bean们就在BeanFactory中蓄势以待地等调用了。下面通过一个具体的例子,来详细地学习一下...
时间: 23:13
来源: Yikun
PHP 代码规范简洁之道
1. 统一的编码规范 编码规范往简单说其实就是三个方面: 换行 空格 变量命名 放在 PHP 里面,还有一些附加的地方,比如关键字大小写,语法糖的使用( array() 与 [] 等)的问题。之前整理过PSR的标准,也找过php-cs-fixer这样的工具。这些都是规范代码的重要...
时间: 23:08
来源: Scholer's Blog
AutoLoadCache 是一个高效的缓存管理解决方案,而且实现了自动加载(或叫预加载)和拿来主义机制,能非常巧妙地解决系统的性能及并发问题。 145commits 1branch 15releases 2contributors Java100.0% Java New file Find file HTTPS Download ZIP Branch:mas...
时间: 23:07
来源: GitHub扫码下载官方App
云课堂 & 挖课机NO.65
[作者]侯爵
终于找到了适合编程小白的入门方法!
有没有哪一个瞬间,让你想要放弃学习编程?
在我决心开始学编程的时候,我为自己制定了一个每天编程1小时的计划,那时候工作很忙,我只能等到晚上9点,同事都下班之后,独自留在办公室编程。在翻遍了我能找到的几十本国内外的 Python 编程教程之后,我还是似懂非懂。那些教程里面到处都是抽象的概念、复杂的逻辑,对于专业开发者这些再平常不过,而对于我这样一个学设计出身的编程小白,没有被视觉化的东西是无法被理解的。
而且,这些书大多着重于一步步构建一个完整体系,但事实上,现实生活中没有哪个技能是这么习得的。难道要练习1年切菜才能给自己做一顿饭么?难道要到体校学习3年才能开始晨跑么?难道要苦练5年基本功才能开始拿起吉他弹第1首曲子么?
做任何事情一定有在短期内简单可行的方法。学习不应该是苦差事,而应该是快乐的,重要的是找到适合自己的学习方法。
既然笨办法不能让我学会 Python,那么我决定用一种聪明方法来学,为自己创造学习的捷径。
逐渐摸索出了一套高效学习法之后,我的编程学习速度突飞猛进,不到一个月时间就完成了一个数据分析的网站。为了追求最大程度的精简,我借用了许多强大的库和框架,这让我不需要重新发明轮子,而是专注于最核心的功能。在一次项目合作中,我惊讶的发现,我用70行代码实现的功能,一名工程师竟然用了800行代码来实现。在运动场上,第一名和最后一名的差距也许只有几十秒。然而在编程这个竞技场上,不同方法的效率竟然会有10倍的差距,这也正是追求高效学习的价值所在。
实际上,如果你听说过《如何高效学习》中的整体学习法,你会发现它和我的高效学习法很相似,作者斯科特·杨用一年的时间学完了麻省理工四年的课程。既然这种高效学习法可以用来学习经济学、数学、物理,那么当然也可以用来学编程。
这种高效学习法的核心在于:
学习最核心的关键知识,而不是像啃字典一样啃编程书。
在80/20法则中,20%的关键投入带来了80%的产出
李笑来老师写过一篇《最少必要知识》的文章,里面提到过,
"学任何东西,想要“速成”从来都是妄想。但是,用来起步的那一点“最少必要知识”不仅是可以迅速获得的,也是必须迅速获得的。"
在汉语中,掌握常见的个字就能看懂80%的文字。在编程中,同样有着最核心的关键知识。对于一个编程小白来说,我认为最关键的知识有这些:
● 最基础的编程语法,包括:循环、条件判断、面向对象等;
● 掌握 Google 搜索报错的方法;
● 知道如何找到适合的第三方库、框架,并且运用它们来完成自己想实现的功能。
先用这些关键的知识构建你的知识体系会让学习效率加速,这是比一开始就钻到各种细枝末节里面更好的学习方式。
运用类比、视觉化的方法来理解这些核心知识,而不是死记硬背。
我们的大脑并不是计算机,所以机械记忆是一种低效的学习方法。人的大脑是通过数十亿个神经元相互联系储存信息的,记忆的过程就是在不断的建立连接。当学习新知识时,主动和已有的知识经验创造联系,就会记得越牢、理解得越好。
在学习类的时候,有一大堆难懂的概念,这时候我看到了手边的可乐,突然想到,类的实例化的过程,不就像是可乐在生产线上贴标签的过程么?这样的类比,让我只要一看到可乐,就想起了类的这个概念。
构建自己的知识体系之后,再通过实践去逐渐完善知识体系。
我在学习吉他的时候,我的吉他老师让我只练基本功,不练曲子,这样每周一次课程,学习了半年时间,我终于放弃了。所有的兴趣都被枯燥的基本功耗尽了,并且有一种什么都弹不了的挫败感。
学习编程也是一样, learning by doing 才是最有效的技能学习方式。我是一名实用主义的开发者,我相信你也一样,学习编程是为了真正做出点东西来,也许你想爬取大量的数据和信息,方便用来分析与决策。也许你想快速搭建一个网站,展示自己的产品。也许你对量化交易感兴趣,想试着把自己的投资策略程序化。对于实用主义的开发者来说,更应该追求的是“达成”而不是“精通”。先掌握项目所需的最少必要知识,然后把热情和精力投入到搭建真实项目中,而不是死磕半年的基础知识,直到把所有兴趣都耗竭了也没做出来什么像样的东西。在实践过程中,你自然会逐渐完善知识体系。
通但是新手又不适合直接做难度很高的项目,最好的实践方式是:分解练习+循序渐进。其实这和学习吉他很像,分解练习能让你对每一个知识点都熟练运用,循序渐进则能让你的能力随着任务难度不断提升。但是,这种实践方式需要被精心设计,作为缺乏经验的新手可能很难制定出这样的学习计划,推荐你选择精心设计的、以练手项目为主的实践课程。
高效学习的免费入门书
为了能让更多的编程小白轻松地入门编程,我把高效学习法结合 Python 中的核心知识,写成了一份教程——《编程小白的第一本 Python 入门书》。
随意翻上几页,你就会发现这本教程和其他编程书的不同,其中有大量的视觉化场景帮你理解概念,穿插了若干有趣的小项目,最重要的是,这本教程是为零基础小白而设计的。
高效学习的 Python 实战课程:限时优惠
如果你喜欢这本书,相信你也会喜欢我们在云课堂上的课程: “Python 实战:四周实现爬虫网站”,前面提到的书也包含在这门课程里面。
这也是我们团队的作品,延续了这本书的风格,生动、易懂、好看。有零基础学员说:
"这是我唯一能听懂的编程课,和看美剧似的,会上瘾。"
这门课程以实战为主,把一个涉及了爬虫、数据分析、网站开发的二手行情网站作为主项目,拆解成四个 level 的课程循序渐进。为了更好的分解练习,每节视频课程后面都穿插一个小项目。这门课提供了一条实战学习的最优路径,让你在最短时间掌握最关键的实战技能点。
发布了半年多,这门课已经成为网易云课堂上最畅销的编程类课程,免费课程有4万多学员,付费课程有接近1千名学员。如果你想要快速上手实战项目,先掌握项目实践中最必要的技能,这会是适合你的选择。
6.16-6.18 这三天还有网易云课堂的大促活动,领取优惠券之后,购买这门499元的课程可以节省50元。考虑到我们的课程从不降价,这是入手的最佳时机了。优惠券有限,抓紧时间抢购吧!
点击立即领取优惠券
网易公司()旗下实用技能学习平台。与顶级机构、院校和优秀讲师合作,为您提供海量优质课程,以及创新的在线学习体验,帮助您获得全新的个人发展和能力提升。
关注我们:
& 网易公司 版权所有如何学习编程?
没想到收到这么多赞同,有点受宠若惊,我觉得自己的经验或许对那些不是科班出身,但是又对计算机感兴趣的同学更有帮助一些。当舍友怀着满腹不解问我为什么能够在电脑前对着黑框玩一天,我会反问他为什么你可以在电脑前玩一天游戏?Just for Fun !更多可以参考我的另一个回答----------------------------------------------------------------------------------------------------------------------------------很多人都说最好通过C入门,但是我自身经验告诉我,最好先从一门脚本语言入门,如我的入门是通过PHP。一开始接触C语言,老是对着一个黑洞洞的框,容易使人丧失兴趣。这些黑框和我们常见的QQ、Office等桌面程序相差实在太远了。而且往往在初学的时候没有人告诉我们控制台应用和图形界面的应用之间的关系。如果对Web感兴趣可以先学点基础的HTML和CSS虽然这在严格意义上不算是编程语言,但是却可以在一开始让你做出一个可以看的到的界面,而且掌握基础还是很简单的,然后在学点后台开发语言,我推荐PHP或者python。记住,新手最重要的是保持热情!学习一段时间之后可以自己尝试做一个简单的留言板,别小看这个老土的小东西,这个可是能让你立刻充满成就感。而如果你一开始就上手C这样的成就感就需要更久才能获得,而往往很多新手都躺在了前进的路上。然后,可以在留言板的基础上做出一个简单的博客系统。记住一定要在每一阶段都做出一个看上去"正常"的东西,而不是一堆代码一执行出来一行行字符那种。这也是我推荐学习HTML和CSS的原因,因为这可以让你简单地搭建一个拥有用户界面的程序。当你把这些都做完了,如果感到对编程还是有很大兴趣,而且感到自己在渐渐地从心底里喜欢上了编程,那么你再面对那些黑框的时候,就会感觉好很多,而且感到自己真的很酷,你会喜欢把自己想成电影里的黑客。至于说算法数据结构,等有了兴趣,需要这些知识了,再去慢慢学习,都不会是障碍,而且会变得有趣许多。但是一开始没有任何程序基础,就给你学这些,只能使你迷糊,根本不了解这又什么用。这也是我讨厌现在的大学教育的一个方面,完全违背认知规律。先给你讲一大堆理论,不告诉你为什么,有什么用,让人感到厌恶,但当后来我们真正需要了,却也记不得了,只能从头再学。最后,我还是要补充一下,对于新接触编程的童鞋,或许保持兴趣是最重要的,但是在你对编程有一定了解之后,你会发现自己还有很多困惑,这时候就需要恶补基础知识了,对底层了解的越清楚越有助于你消除困惑和对编程更深层的理解。
昨晚在另一个地方发了个类似的回答:昨天才进入知乎社区,不知道社区的转载主要以什么方式,所以就用最传统的方式——复制黏贴,这么转过来了。刚注册知乎就见到了这条问题,所以就留到晚上来回答了。虽然才毕业一年,但是因为竞赛的原因从小学低年级的时候就开始学习程序设计,直到大学读了计算机,被各种老师教导过、自学过、教过学生。什么是编程?我刚开始学习那时,面向对象和互联网,至少在国内,还没推广开来,甚至不多人知道。直到现在,也就现在大家见到的这个时代了。扯这历史要说的是,“编程”对我而言从一开始的竞赛,到现在的“创作”,已经是两个范畴的概念了;同样对于时代的需求,从从前的科学计算,到现在的各个行业各个角落的各种应用实现,已经不是一个同样的行为范畴了。但是,编程的本质上跟当年课本上写的没多大区别,就是编写(广义上的)计算机可执行的指令(集合)。这个领域的知识是什么样的?然后要延伸一下时代问题。从面向对象开始,互联网时代兴起,到现在的移动互联网时代,编程绝大部分的目的是在于创造“软件”,而创造软件也由于世界上最聪明的人群高速集中涌入,以及时代的需求压力,已经形成了一整套工程学,也就是“软件工程”了。现在“编程”被集中在“软件工程”的需求中,产生的一个结果就是“工程化”,而“工程化”就是整个生产体系开始逐步分化以及逐步专业化,从而出现了这个领域中的各种针对性专业,比如“前端工程师”、“测试工程师”、“算法分析师”、“.NET软件工程师”。在整个软件的开发周期中,我们都需要跟不同的人在不同程度的合作。即使是个人开发者,都会用到开源的代码、各种下载的人家做好的工具。这就是工程化后的结果,也就是“编程”被和其他不同的专业,比如数学、医学、建筑、人文等科学结合在一起然后具体地分化成了各个关联的模块。这些模块有一个特点,就是整体上“临近相连”。这什么意思呢?举例说明就是,但从(某个)网站开发而言,就有客户、老板、美工、前端工程师、服务端工程师、数据库管理员、网络推广等等。这些角色两两间可能有工作上的直接关联,单指这个软件项目的开发工作的话。无论哪个是因,哪个是果,现在的情况都是没两个角色间的知识必定关联和有交集。在往广度上看,整个软件工程领域以及世界都如此,只是软件工程领域如建筑领域一般,有比较大的定量的专业化,一切都是有根据有标准的。而至此,形成的一个结果就是,没有人能掌握所有知识;所有知识都是有关联的,追寻着关联的路径学习产生的效果普遍情况下是最大的。后面那条可以简单地证明,假设两样知识八竿子打不着,那么你就要等很久它们才能连起来,发挥加成效用。虽然乔帮主说过,总有一天这些dots总会连起来的,但是嘛......靠谱点也不是不好。所以,学习这个领域的知识是这样子进行的那么,回到学习上,就变得很明确了。开发的需求需要各种技能,各种技能都是相关的,而一个项目所需要的技术在一定期限内是大致有限的。如果你要开发某样东西,或者做某种用途(比如科学计算),都需要某个知识点进行切入,从哪里都好,切入某个知识点,然后用关联的方式扩充。如果在过程中见到新的不懂的名次,要么马上去“扩充”,要么就记下来,留待以后“点亮”这个天赋,总有一天这些dots......以上是学习编程要要知道的第一点,这个领域的知识是怎么组织的。以下第二点,关于学习方法。一个学习的误区与结果有句名言,是布鲁克斯(Frederick P. Brooks)说的吧,说过,最好的程序员和最差的产出差n倍。为何?计算机科学基本上是由数学和机械类学科衍生而来,最大的特征就是两道门槛:能不能做出来、这个方法(算法或者设计)效率有多高。前者不说,后者最明显的举例就是,用加法来计算和用乘法来计算效率差别极大。这个领域的只是最大的特点就是它们的关系如果你想打通,是需要“理解”的,至少知道怎么用。你不懂得一个公式、一个技术怎么使用,你知道有,到需要的时候也用不了。所以钻研是一种必要的学习习惯。看到以上内容的时候,你可能会觉得,一开始都设定好要做的目标,然后弄清楚这个范围需要的知识点,然后都从某点开始,全部学透,就能完成了。这犯了个软件工程的一个极端化错误,在学习上也同样适用,因为每次开发都是基本上是一次学习过程,你又不是*讯,你所做的东西就算别人做过,你也一定没做过。如果别人做好了给你,也不用你做了,腾*也不用去抄了是吧?这个错误就是将整个项目理想化,如果把这次学习视为一个项目的话。整个项目都是原本不存在这个世界上的东西,没人知道开发(学习)过程中会发生什么,怎有任何可以相信的精细的计划?如果这么学,你会很容易陷入一个,拿了一本专业书(一个切入点),然后看,然后看着看着就看不下去了。然后?然后就没有然后了......我们是怎么解决这个问题的软件工程里是怎么解决这个问题的呢?敏捷开发(Agile Development),每个项目或多或少都能用到。详细解释可能太多,毕竟我知道的也不多。不过其中最通俗的几点:将大计划切分为短周期,并且每个周期结束后调整计划,使得最近的一个计划可执行并且有效;计划中,将每次的产出进行具体化量化,每个周期都发布(生产出)有效的可用的产品,这个产品是在上一个产品的基础上的改进或者增加;在原有的产出已经难以再升级时,将原来的产品重构(重新设计、重新生产)。细节的道理就不多说了,都出了多少本书了。实际上现在你能买到的好的编程教学的书籍都是遵循这个教学模式,也是暂时被认为最有效的书本教学模式。这些书一般会教你从“Hello World!”(到时你就知道是什么了)开始,让你手把手做一次,然后逐步深入;有时候做了一次后,在后面介绍了新的技术,又会让你用新技术跟着做一次;看完整本书,你至少就达到了某个水平了。要注意的是,你必须有心理准备就是,书上讲的,跟你做的根本有不同的产出,或者你根本做不到。比如书上说计算a+b会输出2,而你的输出3;书上说要点击某个按钮,但是你就是在自己机子上找不到那个按钮......这些都是不可避免的,而且一般都会浪费很长时间。莫名其妙的问题本身就是以上说的,不知道会遇到的问题的一部分,也是现代程序员加班的其中一主要原因。毕竟,你的机子跟作者的机子肯定不一样。所以学习该是这样的总的来说,说到了知识是关联的,学习是以不同的学习成本连接不同知识的过程。还有呢,值得鼓励的是,随着知识的增加,智力和经验会随之提高,学习成本也会降低,越来越容易学习。虽然具体到某个知识点只有懂和不懂,但是具体到一个面,还有懂多少的问题。这就回到了刚才的引述,生产效率为什么会差n倍。因为这是一个广度和深度的综合比拼,而随着时间增长,会形成两个人知识的“马太效应”,差距会成倍增长。不过放心吧,这个增长是有天花板的,无论是知识总量的有限还是需求有限导致的,至少从程序员的工资就可以看出来(哭)。具体的学习建议到这里,至上而下地给出学习建议:先有一个想法,像学钢琴也有一开始想弹奏的曲子,提出一个想用生产出来的产品,或者买一本评价好的入门书,做出书中提出的“产品”为目标将这个目标细化,可以找专业人士帮忙,梳理出知识的“切入点”以及周围的“关联点”,然后开始计划第一次迭代(做出第一样东西),可以是一段很短的程序或者一个作品,但必须有具体的产出每次产出后都重新调整计划,重要的是自己或者专业人士要能具体地评估这次产出的价值。如果是跟着书就自然容易了,就是跟书上对一下就是了如果要具体给到一个切入点,那么我的建议是两个选择:从C语言开始,然后学习算法,走科班路线从网页制作开始,然后学习网站工程,走产品路线,这是产品中最好入门的了不必太担心学错,因为到达工程级别,你学过的八成知识都不会被作为工具使用,而它们的只是实现了它们的历史使命——成为你现有某个实用知识的中间点/桥梁、为你现在的学习效率做了一次铺垫。实际一点地说,对于一个“毕业了”的程序员,学习一门新的编程语言,可能只需一周,而熟悉需要三周,熟练地用于开发是三个月,精通只需一年。这也是大概而已,严谨地说,不同的语言所关联的知识点的数量是不一样的。这也不影响举例,因为在这之前,一个大学生在学习他们的第一门语言,通常是C/C++,用了一个学期,还可能挂科呢(那是态度问题或者是Dota的问题)。首先吧,别想速成。这要能速成,那么我们专业人士不就该喝西北风去了?所以要真解决了学习范围的问题后,你下一个问题应该是“要实现**应该具备那些知识”一类的了。等你在某个点扎根后,想的就是利用这个学习能力,去另一个自己更喜欢的领域,还是就此为据点扩充范围,亦或者深入这个领域(也是扩充的一种吧,方向不同)。最后重申的一点,就是软件开发本身就是一个学习的过程,只是产出的代码具备不同的价值而已。软件的特殊性已经导致了难以重复地写出两段相同的代码,一般只会改写重写,或者重用原来的代码(就是复制黏贴或者引用调用)。
题主问如何学习编程,应该是入门,那我告诉你就这么学——全宇宙最快的学习编程方法,一般人我不告诉他:最后奉劝不要去看网上所谓的培训视频,浪费时间。优秀的文字版教材对着练就是最好的方法,方便快捷。最后奉劝不要去看网上所谓的培训视频,浪费时间。优秀的文字版教材对着练就是最好的方法,方便快捷。------------------------------补充解释:为了集中精力我把两个软件的ui设成了黑色,顶部是任务栏,个人习惯而已不必模仿。图片中演示的是:左边是foxit阅读器,PDF格式编程书籍(当然也可以换成网页版文字资料),右侧是IDE工具。按图中的方式调整两个窗口大小,就可以一边看一边练习书上的代码,有效利用了宽屏显示屏。实测学习效率很高,比拿着纸质书练习高的多,非常适合新手入门。至于学习资料,根据高手的推荐书目,自己去搜吧 也可以购买电子版图书。
熟悉以下关键东西,可以边学边做,定期训练,经常思考,长期积累:语法。
基础理论(数学、数据结构、算法等)。设计方法(编程原则、设计模式、框架设计等)。库(核心、基础、UI、扩展、游戏引擎等)。计算机相关(操作系统、网络、图形学等)。领域知识(游戏设计、网站设计等)。开发工具(编辑器、IDE、自动部署等)。项目管理(进度管理、分工协作、Bug管理、版本控制等)。最普遍也是最重要的能力:创造力。努力分析并理解好做什么以及怎么做。要知道上面那些东西一开始都是不存在的。具体方法包括:快速阅读入门教程和书籍,适合学习语言和基础库。比如我学Java读的《Java编程思想》,练习题做过一点,然后学ActionScript就没读过书,只读过Adobe官方文档《ActionScript 3.0编程》。阅读库的文档、实例、源码。比如Flash、Flex开发,熟悉官方API很重要,很多细节要具体使用时才注意到,这时候最好做个笔记,虽然我从没看过我的笔记。做一个自己感兴趣或熟悉的小项目,比如我就以黑白棋游戏作为多个语言的试水项目,一样的逻辑,便于把关注点放在语言特点上。自己动手丰衣足食。厨师有菜谱,程序员可没菜谱。比如我做游戏,最关键的游戏编程知识全部是动手学出来的,很少有专门针对某个业务领域(如游戏)的编程书籍,要么是入门书,要么是模式书(如算法)、理论书(图形学),很少有书籍教你如何开发一个45度角地图系统加编辑器的,全靠自己思考,以及看前人的代码,需要时找些网络资料。关键是,可以培养最重要的创造力。对于算法和设计模式,可以研读下,但是关键还是靠平时如何使用了。新手勉强不来的。项目管理方面的,就得靠工作经验了,多思考多提意见不要只走流程。
Peter Norvig 的 Teach Yourself Programming in Ten Years [1] 是很好的指引性文章。[1]
标题起得太大咯,是在故作老成么?“程序人生的寂静欢喜”——怎么看都感觉像是某位已故计算机大师的墓志铭,可却偏偏被一个菜得抠脚的毛头小子拿来当做人生寄语——也是日了狗了!人都没生过,谈什么人生!?莫怪我,我偏要“奢谈”一下!一.记叙一开始我是拒绝的!因为我根本就不喜欢写程序。打高中数理化就不好,什么排列组合、圆锥曲线、电磁场中一带电粒子、水溶液中的水解电离,困扰我有如梦魇。高考时,祖坟上冒出一缕青烟,数学创历史新高考了88,理综破有史记录考了200,数据不仅太美太感人,而且大吉大利、元亨利贞!终于,我以总分522分考上了一所梦寐以求的2本就读于计算机科学与技术1202班——命中犯2!可是对于编程其实我是拒绝的——大一花了一年的时间来研究心理学,大二花了一年的时间来研究哲学,大三花了一年的时间来研究中医——结果,《离散数学》挂了,《数字逻辑》挂了,《数据结构》挂了,《编译原理》挂了——恨不得自挂东南枝!人在做天在看,出来混总是要还的!曾坚信“天生我才必有用”,“我辈岂是蓬蒿人”;曾笃定“心所愿力毕至”,“有志者事竟成”;曾夙愿“天授其赋必赐其福”,“好风凭借力,送我上青云”。可是,一个冷峻若紫电青霜的问题劈面而来:不写程序又能干嘛呢?然而我根本就不会写程序!试想,一个打字只能用到右手食指、左手食指和左手无名指的人,敲代码时是多么捉急!试想,一个高数补考考了19分,满脑子宏大叙事的理科弱智,写程序时是多么脑洞大开!后来去公司实习,遇到的第一个项目就是要使用通信框架,当我第一眼看到了开发手册上的如下句子时,我就知道,春天不会再来了!客户端通过调用ESPlus.Application.Basic.Passive.IBasicOutter接口对应的方法以及预定其相关的事件,就可以完成基础功能或得到相关状态改变通知。我们可以从 ESPlus.Rapid.IRapidPassiveEngine暴露的BasicOutter属性来获取IBasicOutter引用。接口、预定、事件、暴露、属性、引用,你们一个一个来,我还大概能明白,你们群起而攻之,我便委地如泥了!重载的Query方法(带有CallbackHandler参数的)在发送请求信息后,不会阻塞而继续向下执行,而框架在收到对应的回复信息时,会回调CallbackHandler委托指向的方法。由于调用线程与回复回调的线程不是同一个线程,所以称这种机制为回复异步调用。再当我看到“重载”、看到“阻塞”时,我彻底愤怒了!而紧接着映入眼帘的“委托”、“回调”更使我出离愤怒!最后“线程”、“异步”更令我万念俱灭,心如死灰!从此,我便以一种菜得抠脚的姿态狼狈不堪地行走在险象环生的程序世界里。莫非是寒更雨歇,葬花天气,猎猎北风袭单衣;荒原寂寂,远听猿啼,近看寒鸦起;鬼影幢幢,步步惊心,不知今夕何夕。好多次我都想,别瞎费劲了,你不是写程序的料!真正适合写程序的人根本就不可能是这个样子!于是乎放弃。可是不写程序又能干嘛呢?好歹读了四年大学,何况拉弓没有回头箭。还是要顶风逆水雄心在,不负人民养育情!终于,苦水的浸泡痛彻了肌肤,磨练了身心,同时也浇灌出了涅槃之花!某天我突然发现,那些原本看来佶屈聱牙的技术文档如今看来却直白如话,那些原本晦涩难懂的语法如今却能够熟练运用,那些原本看都看不懂的源码如今也能够在自己指下流淌,实习之前我连循环语句都写不对,如今却也能用和等框架开发出像样的网络通信应用。二.议论更重要的是,从当初的不喜欢、不擅长、不自信,到而今能够怀揣着一颗欢喜之心来写程序,能够以乐在其中的心绪来开启自己的程序人生,这不仅是我收获到的莫大财富,更是我把握住的莫大幸福!胡适先生的名言:“怕什么真理无穷,进一寸有一寸的欢喜。”真理无穷并不可怕,因为我们在每一寸的前进中始终获得欢喜。编程之路并非坦途,我们也并非天赋异禀,然而那个最幸福的人,并非是玩转代码的编程高手,也并非是亿万家资的IT精英,而是那个在流年中始终以欢喜之心书写代码,又通过书写代码恒久再获欢喜之人!常言道:“男怕入错行,女怕嫁错郎”。嫁郎要嫁有情郎——有情饮水饱,无情龙肉都无味!入行也是一样。入了所爱之行,举手投足皆得欢喜;入了所憎之行,坐卧立行尽是苦悲!嫁郎的幸福不在于嫁郎所获得的富贵荣华,其根本在于郎本身。那些通过嫁郎以获取外在利益的女子,她们充其量只是获得了生意上的成功,而根本没有获得婚姻本身的幸福,而这何尝不是一种买椟还珠?同样,那些以工作作为纯粹手段的人,他们也从来没有获得过工作本身的幸福快乐。由此看来,我想恐怕对于绝大多数的程序员而言——你不是真正的快乐!所有程序员恐怕可以粗略的划分为这五种状态:1.不爱,但是迫于生计2.无感,反正亦步亦趋3.热爱,但却身心俱疲4.狂热,打了鸡血一般5.欢喜,毕竟乐在其中你是属于哪一种呢?如果要我来选,我一定会选5,因为唯其如此才能获得程序人生的个中真昧,才能拥有彼此交融的内在完满。而其他的几种状态在不同程度上都是残缺的。也许我们写程序总是不可避免的为了各种外在的目的,但是写程序时的那份小确幸的欢喜,却始终是我们精神飞鸟的栖息地。 正如孔子赞颜回——子曰∶“贤哉回也,一箪食,一瓢饮,在陋巷,人不堪其忧,回也不改其乐 。贤哉回也!”罢笔时风烟俱净,但愿自己刚刚开启的程序人生能够无关风月,寂静欢喜。
编程,跟写文章一样。程序语言,就是一门精炼的外语。所以学习的手段都一样,不外多读,多写。同样同任何语言一样,要学成是要花费大功夫的,编程不是小玩意。所以要是玩票只是对计算机对软件感兴趣,可以多了解体验些软件网站,欣赏好文章就得了,真要学,得做好长期时间投入的准备。
我认为主要还是兴趣,没有兴趣是很难深入的。而兴趣的培养可以从一个个小问题的解决开始。可以看看网上有人写的How To Become A Hacker.
没有女朋友,你们学毛的编程
从非程序员的角度回答一下。请问“如何学习英语?”。“英语”,"编程“,都是死的。思想才是活的。诺贝尔文学奖向来是颁给伟大的思想的,而不是没有意义的修辞。编程是向各种抽象计算机器交谈的抽象工具,学会”I you are“只是小学生的事情,你的最终目的是要学会写诗。有朋友在一个12人初创游戏公司当策划,他表示公司中6个程序员主要是中专毕业,程序质量差,适应能力差。窃以为中专的编程教育应该是猛敲键盘为主,理论教育稀疏,如果以这样的“编程水准”来做一名职业的程序员,职业前景并不乐观。我在美国的一个初创软件公司实习过,100人的规模。公司的CTO曾经靠篮球专长上了个社区大学,非计算机专业,辍学后经商多年,失败。在岳父帮助下,他做了电话接线员,软件公司的电话接线员,任务就是把客户的疑问记下交给程序员。他暗自学习编程,若干年后,他可以直接回答客户的问题了,甚至比正牌程序员水平还高。公司很器重他,派他去某编程研讨会。他在大会上侃侃而谈,却被别人暗地嘲笑。原来与会者大多是phd,而他呢,其实根本连问题本身都没理解。从此他开始恶补理论知识,即便他现在已在多家公司担任过CTO,他依然坚持每天4点起床,看两个小时的书。当时他表示他在跟进斯坦福的机器学习课程。好,既然思想最重要,工具只是辅助,那你首先要清楚你脑袋里要装哪种伟大闪烁的思想,然后选择适合你的工具。这其实暗示了,学习的每一个小阶段需要一个具体的目标带给你激励。比如,”今天我一定要写一个UDP client发送一个hello world。思想 -& 例举工具--------------------------------------嵌入式,架构,网络等 -& C计算机视觉,机器学习 -& Matlab, Python计算机图形学 -& C++计算生物 -& perl网站后端 -& perl, python, ruby, php, scala编程语言 -& haskell软件分析 -& java,C++当然,我估计楼主想当个伟大的码农!那么,路线图应该是:先大致学个java或python,能实现简单算法就行,别纠结什么继承啊,函数式编程之类的,没有上手实际经验很难吃透。一定要在linux下学习,通过命令行来编译,这是肺腑之言。(推荐鸟哥的通俗入门教程)然后去刷算法题,做到熟练。到了这一步,楼主自己应该有自己的想法如何继续发展了。
已有帐号?
无法登录?
社交帐号登录

我要回帖

 

随机推荐