[讨论]如何学习程序设计

baihacker 2009-12-04 03:13:25
看到http://topic.csdn.net/u/20091126/20/7551a170-2015-4e75-8c6d-72fe70efc227.html
感觉不如讨论一下如何学习程序设计.

首先我还是比较推荐看看
http://hi.baidu.com/feixue/blog/item/0fd82f2eb092d0584fc226df.html
说得比较"虚",但是也是比较实在的话.可能对具体学习不会有直接帮助,但是具有一定的导向作用.

其次,每个人有不同的适合自己的路,不必又犯老毛病,去敌视别人的路.
关于别人的路,前不久有一篇贴子:
三个月的学习历程

再次,不赞同老的模板化的路:"小学,中学的时候,老师把东西讲得烂了,然后给例题,做题,布置作业,完成作业,有时还要背书..."
我父母以前经常问我,万一你记忆力不行了怎么办啊,怎么读书啊.我就解释,读书不是背东西啊.
对于这个问题也一样,学编程不是像完成任务似地把这个流程走完.(不是反对通过做练习来巩固知识,不是反对必要的记忆,而是不赞同机械的流程式的学习).
和这路相关的问题有:
1.喜欢去找答案,知道了解答,就像完成了任务,也像一种自我暗示:我懂了.(不是反对找答案,而是带着这种心理的找答案)
2.盲目信书.书上有错误是灰常正常的事.但是这个模板化的路,在一定程度上扼杀了去怀疑去思考的能力.
3.进一步达到的状态就是,快期末了,把代码抄到电脑上.每个单词,字,都认识,但是连成这一串就不知道干什么了.一编译,一大堆错误,然后就急了,哭了...上论坛求助了...最后考试结束,把书一扔,大叫:"解放了,终于不用碰这东西了",几年后,为了找工作,迫不得已,又得和程序打交道...常上CSDN,从菜鸟混到高手...

然后,一些小建议:

1.是什么?
今天学到的是什么东西,能不能简单概括一下.
比如类:把一些数据及其相关的操作封装在一起,并加上访问权限,形成一个整体.


2.为什么?
为什么语言要提供这种东西?为什么要有权限?
用类可以更确切地去模拟现实世界中的事物.加上权限,可以避免不必要的破坏,或者是可能正确的访问,但是不在控制中.


3.怎么办?
如何使用类?
首先给出声明及其定义.
class 类名
{
public:...;
protected:...;
private:...;
};
对函数的定义的方式.
然后在需要用到这个类所模拟的事物的时候就:
通过 类名 类对象名; 来定义一个类对象.
通过 类对象名.数据成员名 可以获取或者修改这个数据成员.
通过 类对象名.成员函数名(参数列表) 可以实现某个操作.
有什么要注意的吗?
}后面不要忘了;
当成员不是public的时候不可以在外部以类对象名.数据成员名 或者 类对象名.成员函数名(参数列表)的使用.
(在刚开始的时候,可能更注重在怎么办上,有哪些需要注意的上,但是只要知道基本的就行,不必太抠)

如何将类应用到问题中?
比如要用两个坐标描述一个点,坐标是浮点数还是整数?
浮点数的话,用float还是double?
如果是整数的话,坐标可能的范围是多少,并提醒自己可能在计算过程中溢出.
是应该把这两个暴露在外面:public还是藏在里面:protected,private?
在自己的问题中,应该提供哪些操作?
求两点间的距离?边界检测(应用于描述一个矩形内的整点)?

在学了基本类型,数组,控制语句,输入输出,之后.
其实就能解决很多问题了.
这个模式的解决问题无非就是,输入数据,用一些变量表示数据,在这些数据上进行操作,输出结果.
比如,输入一个非负整数,输出其阶乘值.
首先需要一个变量来保存这个输出,还需要一个变量保存结果.
要注意,保存结果的变量应该初始化为1.
然后分别把1到n乘到这个结果上.
最后输出结果.
在这里,分别把1到n乘到这个结果,就要用循环语句.
对于新手,应该考虑,应该有哪些变量,其作用是什么.经过什么样的操作达到目标?然后实现.

以上三点都是说要思考,当然需要思考的不仅仅局限于此.

4.大局观
对语言要有整体把握.(其实,看看书的目录是好习惯)

5.语言细节与设计技术
对于C++,再次引用《C++语言的设计与演化》的部分摘录:

首先强调一些概念,随后再强调概念之间的关系和主要的语言特征。把各个单独语言特征的细节先放下,直到人们需要知道它们的时候再去学习。在这种方式不行的那些地方就修改语言本身去支持它。这种相互作用使语言逐渐成长为一种适宜用于设计的好工具。
请注意,学习C++,最根本的是学习编程和设计技术而不是语言的细节.
在学习C++时,最根本的应该是牢记关键性的设计概念,使自己不在语言的技术细节中迷失了方向.如果能做到这一点,学习和使用C++就会是非常有趣的和收效显著的.

6.其它
不必惧怕编译错误,大胆地去读.如果太多的话,只读第一个错误,一些IDE可以在这个错误报告上双击,就可以跳到出错的行,观察这一行及其附近以及这行涉及的东西.慢慢修改,直到最后没错误的时候,这个过程就像慢慢把美女的衣服脱光,最后全部脱光的时候,赤裸裸在你面前...(我邪恶了)

如果有想法的话,可以设计一些程序去验证自己的想法.
比如int arr[100];
arr = 0;
其实通过这样想全部赋值为0完全正常,但是要完全回答为什么却并不容易,可以先记住这样不行.
在我完全不懂程序的时候
FOR I = 1 TO 100 STEP 2
PRINT I
NEXT I
通过改上面的程序大概知道了这几行的意思.(小学的时候,小霸王学习机,当时学习机的参考资料还比较厚,我什么都看不懂,但是能改,改改数字,把加法改成减法总行吧)
现在学程序,有资料可查,但资料上的例子是有限的,于是可以根据自己的理解,改改...

...

紧接着,还是推荐那本老书吧:
推荐一本初学C++的书

PS:如果只是为了混过60分,可以忽略我上面说的所有话.

大家各抒己见吧...
...全文
885 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamseyang 2010-05-26
  • 打赏
  • 举报
回复
收藏。。。
davelv 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 jackyjkchen 的回复:]
只要大学不网游,不沉迷魔兽、CS,就凭这份毅力,日后也是栋梁之才
[/Quote]
赞同
baihacker 2009-12-07
  • 打赏
  • 举报
回复
...木有人关心此类问题,就结贴了吧,除了22楼,按楼平分的分...

看来还是自己研究自己的问题,偶尔刷点分得了.
xixisongsong 2009-12-05
  • 打赏
  • 举报
回复
嗯,很有深意!
hslinux 2009-12-05
  • 打赏
  • 举报
回复
多动手多动脑。
diablox0147 2009-12-05
  • 打赏
  • 举报
回复
我能得多少分呢。。。
飞天御剑流 2009-12-05
  • 打赏
  • 举报
回复
心静,自然凉.....
lizzoe 2009-12-04
  • 打赏
  • 举报
回复
路过,顶过
chin_chen 2009-12-04
  • 打赏
  • 举报
回复
精华帖?ding
plee1037 2009-12-04
  • 打赏
  • 举报
回复
必须顶!
雨过白鹭洲 2009-12-04
  • 打赏
  • 举报
回复
哥哥还是在校学生啊。。。

有这份心不错,不过技术这东西,范围太广
a452325305 2009-12-04
  • 打赏
  • 举报
回复
态度决定成败
打好基础 将来才能飞得更高
ryfdizuo 2009-12-04
  • 打赏
  • 举报
回复
日有所想,日有所进~~~
小小攻城师 2009-12-04
  • 打赏
  • 举报
回复
说实话我很迷茫 我真的不知道该如何的学下去
我天天抱着c++primer 还加一本accelerated c++
看了刘未鹏的 如何学习c++
可是依然找不到什么好的方法
看了楼主的帖子 依然是迷茫
可能是智商太低。理解力不行吧。
yangaihong 2009-12-04
  • 打赏
  • 举报
回复
多谢楼主,学习了。
myhder 2009-12-04
  • 打赏
  • 举报
回复
有深度
先顶再看
whg01 2009-12-04
  • 打赏
  • 举报
回复
其次,每个人有不同的适合自己的路...
正解。关键要找到适合自己的方法,才能事半功倍。
AvalonZST 2009-12-04
  • 打赏
  • 举报
回复
感谢楼主的提醒!!
wolflion 2009-12-04
  • 打赏
  • 举报
回复
这个蛮好的,尤其是总结方面的,唉

我只知道看,看完忘,要多练习和多想,呵呵
starcat 2009-12-04
  • 打赏
  • 举报
回复
先mark
留待慢慢看
加载更多回复(42)
  在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。 《算法导论(原书第3版)》选材经典、内容丰富、结构合理、逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教材,在it专业人员的职业生涯中,本书也是一本案头必备的参考书或工程实践手册。    第3版的主要变化:    新增了van emde boas树和多线程算法,并且将矩阵基础移至附录。    修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。    移除两章很少讲授的内容:二项堆和排序网络。    修订了动态规划和贪心算法相关内容。    流网络相关材料现在基于边上的全部流。    由于关于矩阵基础和strassen算法的材料移到了其他章,矩阵运算这一章的内容所占篇幅更小。    修改了对knuth-morris-pratt字符串匹配算法的讨论。    新增100道练习和28道思考题,还更新并补充了参考文献。
《Core Java》介绍和我的课程计划 李冰Email: bing.li@asu.eduWeChat: libertymama2021年4月15日 这是我第一次通过录屏的方式讲授主流程序设计技术。从今年二月底至今,我已经录制了105讲52.5小时的视频课程。通过这段时间的工作,我认为借助互联网强大的传播能力,这种新型教育方式完全具备超越传统实体模式的巨大优势,一定会成为未来教育的发展趋势。我会积极投入到这项事业当中,尽我所能提供更多高质量在线教学课程。 一、本课程内容 本课程将以Cay Horstmann的经典著作《Core Java》(第11版,2019年)为蓝本面向广大程序设计爱好者以及专业人员讲授基础Java程序设计技术。对于主流程序设计语言的教学,教材的选用对教学效果具有决定意义。我虽然有大量Java语言开发经验,但并没有时间和精力按照我自己的理解写一部教材。在这种情况下,不妨在现有资料中做出恰当选择。在长期Java程序开发过程中,我收集的各种Java程序设计书籍超过50部。它们包括基础技术、设计模式、并发技术、数据处理、网络通信、性能优化、代码测试以及高级技巧等多个方面。通过对这些书籍的比较,我认为《Core Java》是全面介绍Java技术的经典教材。它篇幅宏大,对Java标准版(Java Standard Edition – JSE)大大小小各种问题做了细致入微的介绍。对学习者来说,它无疑是众多介绍Java基础技术书籍中的最佳选择。 为了方便学习者掌握本书,我对全书内容进行了摘要并编纂成幻灯片。在这个准备过程中,即使作为拥有大量程序设计经验的我来说,我也发现了我对一些细节认识的模糊,有的甚至从来没有接触过。事实上,这些细节对于我们提高程序质量是大有裨益的。作为基础程序设计技术的经典之作,本书除了有翔实完整的描述外,还包括大量具有充分说服力的程序示例。这体现了计算机科学作为当代最重要的科学分支之一所独有的理性诉求。为了使学习者更深入了解每一项技术,我还额外增添了很多程序示例,更加丰富了本课程的内容。这些示例使得全书所有论述都是建立在代码支持的基础上,成为学习Java程序设计技术最坚实的保证。 还有一点我需要说明的是,作为本课程的主讲者,我并不是简单地照本宣科。根据我的研发和教学经验,对程序设计这样一门复杂技术来说,主讲者以往和当前所从事的研发工作对讲课质量有着至关重要的影响。我会把我在研发中的实际体会融入在整个讲课过程中。对所有重要技术,除了清晰阐述原作者观念以外,我会提供我个人的评价供学习者参考;同时,我还会收集其他资料作为辅助,使得对特定技术的解释更加充分。通过多角度的观察体验,促使学习者全面透彻理解Java语言。我认为这种个性多元的教学方式是帮助大家掌握程序设计的关键所在。 由于本书的庞大容量,我还没有足够时间完成全书的录制。我会坚持完成所有课程,估计在六月中会完成第一卷全部十二章内容;在八月底完成第二卷的录制。保守估计,完成后全部幻灯片页数会超过3,000页;程序示例个数超过700个;全部代码程序会超过15,000行;全部视频课程时长至少会达到150小时,即300讲。当前,我已经完成本书第一卷前五章和第六章部分内容的录制,现在共有105讲(52.5小时)的视频,幻灯片达到1,222页。其中包括212个程序示例,共5,130行代码。在完成本书的全部录制之后,本课程将成为国内全网范围内时间最长和内容最丰富的Java基础技术视频教材。 当然,《Core Java》这本书也有它的不足。在全面覆盖Java标准版的同时,对一些重点问题的介绍深度上有欠缺。这对于一部力图囊括所有Java基础技术的教材来说也在所难免。为了弥补这个不足,我将在其他课程中予以弥补。这些课程也同样是基于知名经典著作进行介绍。我的初步计划涉及的著作包括:Steven John Metker的《Design Patterns Java Workbook》、Brian Goetz等的《Java Concurrency In Practice》、Elliotte Rusty Harold的《Java Network Programming》、Charlie Hunt和Binu John的《Java Performance》、Ira Forman和Nate Forman的《Java Reflection in Action》以及Maurice Naftalin和Philip Wadler的《Java Generic and Collections》。另外,我还计划把最新出版的其他重要英文程序设计专著在不侵犯版权的前提下,以视频方式呈现给大家。 二、本课程的理念 一项事业一定会有它的理想。程序设计的理想当然是能够完成伟大软件作品。 我们虽然都会在现实中不得不做出一些妥协,但理想总是唯一能够激发我们最大创造力的催化剂,它同样是带给我们最大快乐的源泉。我们也许在不断降低曾经的理想维度,但我们也同时都会在人生每一个寂静时刻扪心自问深刻反省。那些对我们自己灵魂发出的询问,就是我们不会屈服的个性展示。换句话说,面对理想时,我们自始自终都有来自内在天赋的支持。 当然,除了我们的天赋,为了理想,我们同样需要付出巨大的劳动。这些劳动不仅仅是学习和研发过程的坚持,更多的还是抵御外在环境对我们理想意想不到的干扰。其实,无论是否有那些干扰,在外人看来艰辛的劳动对于拥有理想的我们永远是最大的快乐。 对于程序设计来说,我个人伴着理想和辛勤劳动走了很长的路。即使如此,我只能说我对程序设计略知一二,甚至对做出高质量程序的解决之道还有些迷惑了。但我的这些付出,至少使我坚信没有任何灵丹妙药可以实现所谓“在零基础上几日登天”,我也不认为这样做程序的人会真正快乐。事实上,理想只会离这种模式的程序设计更远。 三、我的经验 作为本课程的主讲者,我应该具备一些基本素质。我希望我的经验能够得到各位的认可。 我现有程序代码量达到1,300,000行,其中Java有950,000行,其他语言有350,000行。至少,我在我的人际圈内没有发现超过这个数目的人。 此时此刻,我还在进行两个重要软件项目的研发。第一个是《新万维网》。它是对传统万维网(WWW)的重大改进。当前版本持续开发超过十年,基础层已经建立,我正在努力修改新版界面。我认为这个产品在学术和市场两个方面都会有很好前景。这个项目现在拥有代码行数882,224。从这个角度看,很可能是我国学界最大的软件研究项目。 另一个项目是《GreatFree: 面向互联网环境的通用分布式程序设计技术》。通过我的大量对比,这是国际学界在互联网环境下第一个具备通用开发能力的程序设计技术。尽我所知,我国在程序设计领域的贡献很少,我的这个成果具备首创价值。我正在把它以新的语言形式展现出来。这应该是我国在计算机领域贡献的第一个程序设计语言。现有成果已经开源,大家可以从GitHub上找到,链接是:http://github.com/greatfree/wind。 我当前还在大学任教。我在国际知名企业也有一些工作和实习经验。我曾经工作和实习过的机构包括:北京大学、西安工业大学、IBM研究中心(纽约)和贝尔实验室(北京)等。我还曾在美国亚利桑那州立大学获得过计算机科学博士学位。 四、英文问题 本课程的教材和幻灯片全部使用英文。英文是科技领域的官方语言,所有最新科技成果都是以英文方式呈现的。随着互联网技术的广泛普及,通过网络我们可以轻易获得足够多的英文资料。这对提高我们的程序设计技术和能力有极大帮助。另外,我认为当前大学普遍存在专业教育和英文教育割裂的现象,这是非常荒唐的。对于母语非英文的人来说,通过英文学习专业是掌握英文最佳甚至是唯一可行的学习方式。英文对于程序设计的帮助是决定性的。寻找一个编程中具体问题的答案,英文搜索结果要远好于中文。对于程序设计人员,英文还有更特别的意义,毕竟程序是英文写的。英文差,完全会导致程序质量大幅下降。最后,我着重需要强调的是,英文能够培养一个人科学理性的思维能力,对提高程序质量有着潜移默化的推动作用。 我多年在大学的教学中一直采取以英文学习专业的方式。实践告诉我,这种方式是成功的,普遍受到学生欢迎。我在我任教过的大学总是最受欢迎的老师之一,这和我的英文教学方式分不开。另外,在我的视频课程中,我对每一张幻灯片都有详细的中文口语解释和大量的程序示例。我认为英文不仅不会影响学习质量,反而会促进对具体程序设计技术的理解,毕竟英文更能反映出技术的本质。相比于大量不精确的翻译书籍,我认为直接学习英文原著是最好的选择。与此同时,借助视频技术实现音像并茂,可以生动展示英文教学内容,一定对提高学习者能力有本质上的提高。我认为大家是会欢迎这种模式的。英文不是学习科技的障碍,恰恰相反,它是我们通向科技巅峰的桥梁。 五、可能的学习者 《Core Java》这本书虽然讨论的是基础Java技术,但它翔实全面的风格其实对每一个对程序设计技术感兴趣专业和非专业人士都会有价值。 第一,没有任何程序设计经验的初学者。相比于其他主流语言,Java是经过长期演化后形成的程序设计技术。Java彻底摆脱了早期机器语言的影响,不存在任何对于机器特征过分依赖的编程方式;Java和互联网技术结合得更加紧密,适合学习者初步掌握互联网开发技术;Java采用面向对象程序设计风格,这是当前被普遍接受和推荐的程序设计理念;还有,相比于其他语言,Java的程序呈现方式更加简化。正是由于上述原因,Java是初学者学习程序设计的恰当选择。 第二,需要全面了解Java技术的程序设计人员。根据我的经验,一个程序员完全掌握一门程序设计语言的所有细节是非常困难的,一般都会存在对某个分支或者部分细节缺乏了解的现象。本课程的全面性会帮助程序员查漏补缺,以较小代价对模糊不清的枝节问题进行了解,从而完善自身的程序设计技术,并迅速在实际研发过程中将所学体现出来。 第三,致力于从事基础软件系统开发的Java程序设计人员。本课程讲授的Java标准版是Java最重要的技术。事实上,Java所有的开发能力集中体现在标准版当中,而非其他任何版本(如Java Enterprise Edition – JEE),更不是其他众多架构(Frameworks)所能代替的。在实际开发中,由于Java标准版一些主要技术使用难度相对较大,很多开发人员会有意回避使用它,转而去借助各种架构进行开发,从而快速完成应用软件的建立。从软件工程角度看,这种做法无可厚非。这些架构不要求研发人员具备深厚的基础知识和技能,只需通过简单配置或者简化的脚本语言编程就可以完成高层应用软件开发。但是长此以往,这种做法会逐渐降低程序设计人员的技术能力。只通过架构开发应用的研发人员大都会失去开发复杂基础软件系统的能力。本课程讲授的Java标准版是Java核心技术,对这个技术的全面掌握是开发基础软件系统不可或缺的。 六、怎样掌握Java程序设计技术 事实上,我不认为只通过这个课程就可以真正掌握Java程序设计技术。这个认识对任何程序设计技术课程都是成立。作为一门需要高度实践经验的科学技术,程序设计课程或者书籍只能是辅助的和启发式的。我认为无论使用何种开发技术何种开发理念,真正决定程序质量的永远是人,而不是单独的某项技术。对于一个高水平的程序设计师来说,他完全可以使用相对落后的技术做出高质量的软件;而低水平的程序设计人员,无论使用任何先进工具都无法保证程序水准。因此,我在课堂上经常和学生们说,你们要坚持“每天编程序”。更重要的是,这个程序应该学生独立思考后设想出的一个软件,每天坚持逐步把它做出来。当这个软件达到特定规模时,设计者才会真正领悟到程序设计的核心价值、各种技术的科学理性意义乃至程序设计的乐趣。 最后,除了“每天编程序”,其实我在课堂上对学生还有一个建议,就是“每天读英文”。前两天,我在网上看到一篇文章。它展示了钱学森先生1933年6月在国立交通大学读书时参加《水力学》考试的试卷。我惊讶地发现这份试卷完全是英文作答。这意味着在遥远的八十八年前,我国大学已经开始使用英文进行专业教育了。遗憾的是,在当前我国主要大学里,竟然还做不到这点。我希望大家能够理解我对英文学习重要性的一再重复:在我们这个全新时代,在一个富有朝气的学科中以英文为蓝本展开自己的理想!  

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧