学了编程经典算法才知道为啥电脑叫做计算机,原来什么程序都是通过算法实现的啊

高中信息技术算法与程序设计第一课_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
高中信息技术算法与程序设计第一课
大小:392.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢如何系统、科学地自学编程知识?
虽然不是码农,但是一直都有一颗码农的心。所以一直想学好怎么编程。&br&&br&先说下自己的背景吧:&br&已经毕业若干年工科男,所以基础知识也就是大学里谭浩强的那本绿壳的 C 语言。&br&但是除了基本的变量、数组、选择、循环,到了指针那就记不清了。&br&&br&然后因为工作需要,自己学了下 Linux 的 Shell 编程(Linux 系统的基础知识很一般),以及 W3School 里面 HTML, CSS 及 PHP 的部分内容。&br&数据库的知识仅限于基础的 selecet, insert, update 操作。&br&最后抄抄改改做了个功能很基础的网站出来,工作上还算够用。&br&&br&现在呢,想系统的学习下编程知识,所以在 codecademy 和 coursera 开始学习。完成或进行中的科目如下:&br&&blockquote&&b&coursera: &/b&&br&Learn to Program: The Fundamentals&br&Computer Science 101&br&Human-Computer Interaction&br&&br&&b&codecademy:&/b&&br&HTML Fundamentals&br&Getting Started with Programming&br&JavaScript&br&Python&/blockquote&&br&现在的问题呢,就在于我自己感觉学习上很不系统,遇见什么抓什么。&br&比如我在 Ubuntu 里装上了 Eclipse 写 Python,可我连 Eclipse 这个软件的性质和工作原理都不清楚,又需要四处去找资料学习。&br&就觉得这种方式不科学也没效率,所以希望各位能指教下怎么自学编程。&br&&br&至于说最后的目的呢,其实我自己是希望能达到一个能独立做开发的程序员的水平,甚至于有能力可以转行去写代码。&br&这里呢,又出现了由于知识不系统而出现的问题:我其实不清楚程序员的分工是什么样的。&br&我不清楚做网站前端和后端的区别是什么,我也不清楚什么是设计而什么是开发。&br&&br&就我自己来说,我自己的兴趣是做网站,同时也对 UE、UI 设计特别感兴趣。&br&另外也希望学习到手机 App 的开发。&br&&br&所以希望各位能指点下,希望达到上面目标的话,怎么样系统的进行自学?&br&同时有什么教材可以推荐?
虽然不是码农,但是一直都有一颗码农的心。所以一直想学好怎么编程。先说下自己的背景吧:已经毕业若干年工科男,所以基础知识也就是大学里谭浩强的那本绿壳的 C 语言。但是除了基本的变量、数组、选择、循环,到了指针那就记不清了。然后因为工作需要,自己学了下 Linux 的 Shell 编程(Linux 系统的基础知识很一般),以及 W3School 里面 HTML, CSS 及 PHP 的部分内容。数据库的知识仅限于基础的 selecet, insert, update 操作。最后抄抄改改做了个功能很基础的网站出来,工作上还算够用。现在呢,想系统的学习下编程知识,所以在 codecademy 和 coursera 开始学习。完成或进行中的科目如下:coursera: Learn to Program: The FundamentalsComputer Science 101Human-Computer Interactioncodecademy:HTML Fundamentals…
按投票排序
我个人最近也在考虑这个方面的问题,这里有一篇【酷壳】陈皓博客,写的相当不错可以看看,里面启蒙部分我已经学了一半多了。希望你对有用。原文地址:博文如下:前言你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)建议:不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。注:你也许会很奇怪为什么下面的东西很偏Unix/Linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:现在的用户界面几乎被两个东西主宰了,1)Web,2)移动设备iOS或Android。Windows的图形界面不吃香了。越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高了。微软的东西变得太快了,很不持久,他们完全是在玩弄程序员。详情参见《》所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。启蒙入门1、 学习一门脚本语言,例如Python/Ruby可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:处理文本文件,或者csv (关键词 python csv, python open, python sys) 读一个本地文件,逐行处理(例如 word count,或者处理log)遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果跟数据库打交道 (python sqlite),写一个小脚本统计数据库里条目数量学会用各种print之类简单粗暴的方式进行调试学会用Google (phrase, domain, use reader to follow tech blogs)为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。2、 用熟一种程序员的编辑器(不是IDE) 和一些基本工具Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。Source Insight (或 ctag)使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。3、 熟悉Unix/Linux Shell和常见的命令行如果你用windows,至少学会用虚拟机里的linux, vmware player是免费的,装个Ubuntu吧一定要少用少用图形界面。学会使用man来查看帮助文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …学会使用一些文本操作命令 sed/awk/grep/tail/less/more …学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd…了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息了解正则表达式,使用正则表达式来查找文件。对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。4、 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)未来必然是Web的世界,学习WEB基础的最佳网站是。学习HTML基本语法学习CSS如何选中HTML元素并应用一些基本样式(关键词:box model)学会用
Firefox + Firebug 或 chrome 查看你觉得很炫的网页结构,并动态修改。学习使用Javascript操纵HTML元件。理解DOM和动态网页() 网上有免费的章节,足够用了。或参看
Firefox + Firebug 或 chrome 调试Javascript代码(设置断点,查看变量,性能,控制台等)在一台机器上配置或 学习,让后台PHP和前台HTML进行数据交互,对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)跟完一个名校的网络编程课程(例如: ) 不要觉得需要多于一学期时间,大学生是全职一学期选3-5门课,你业余时间一定可以跟上学习一个javascript库(例如jQuery 或 ExtJS)+
Ajax (异步读入一个服务器端图片或者数据库内容)+JSON数据格式。HTTP: The Definitive Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers)做个小网站(例如:一个小的留言板,支持用户登录,Cookie/Session,增、删、改、查,上传图片附件,分页显示)买个域名,租个空间,做个自己的网站。进阶加深1、 C语言和操作系统调用重新学C语言,理解指针和内存模型,用C语言实现一下各种经典的算法和数据结构。推荐《》、《》和《》。学习学习学习Unix/Linux系统调用(),,了解系统层面的东西。用这些系统知识操作一下文件系统,用户(实现一个可以拷贝目录树的小程序)用fork/wait/waitpid写一个多进程的程序,用pthread写一个多线程带同步或互斥的程序。多进程多进程购票的程序。用signal/kill/raise/alarm/pause/sigprocmask实现一个多进程间的信号量通信的程序。学会使用gcc和gdb来编程和调试程序(参看我的《》)学会使用makefile来编译程序。(参看我的《》)IPC和Socket的东西可以放到高级中来实践。学习Windows SDK编程(,)写一个窗口,了解WinMain/WinProcedure,以及Windows的消息机制。写一些程序来操作Windows SDK中的资源文件或是各种图形控件,以及作图的编程。学习如何使用MSDN查看相关的SDK函数,各种WM_消息以及一些例程。这本书中有很多例程,在实践中请不要照抄,试着自己写一个自己的例程。不用太多于精通这些东西,因为GUI正在被Web取代,主要是了解一下Windows 图形界面的编程。@ 说:“ 我觉得GUI确实不那么热门了,但充分理解GUI工作原理是很重要的。包括移动设备开发,如果没有基础知识仍然很吃力。或者说移动设备开发必须理解GUI工作,或者在win那边学,或者在mac/iOS上学”。2、学习JavaJava 的学习主要是看经典的Core Java 《》和《》(有两卷,我仅链了第一卷,足够了,因为Java的图形界面了解就可以了)学习JDK,学会查阅Java API Doc 了解一下Java这种虚拟机语言和C和Python语言在编译和执行上的差别。从C、Java、Python思考一下“跨平台”这种技术。学会使用IDE Eclipse,使用Eclipse 编译,调试和开发Java程序。建一个Tomcat的网站,尝试一下JSP/Servlet/JDBC/MySQL的Web开发。把前面所说的那个PHP的小项目试着用JSP和Servlet实现一下。3、Web的安全与架构学习HTML5,网上有很多很多教程,以前也介绍过很多,我在这里就不罗列了。学习Web开发的安全问题(参考,以及)学习HTTP Server的rewrite机制,Nginx的反向代理机制,(如:)学习Web的静态页面缓存技术。学习Web的异步工作流处理,数据Cache,数据分区,负载均衡,水平扩展的构架。实践任务:使用HTML5的canvas 制作一些Web动画。尝试在前面开发过的那个Web应用中进行SQL注入,JS注入,以及XSS攻击。把前面开发过的那个Web应用改成构造在Nginx + PHP-FPM + 静态页面缓存的网站4、学习关系型数据库你可以安装MSSQLServer或MySQL来学习数据库。学习教科书里数据库设计的那几个范式,1NF,2NF,3NF,……学习数据库的存过,触发器,视图,建索引,游标等。学习SQL语句,明白表连接的各种概念(参看《》)学习如何优化数据库查询(参看《》)实践任务:设计一个论坛的数据库,至少满足3NF,使用SQL语句查询本周,本月的最新文章,评论最多的文章,最活跃用户。5、一些开发工具学会使用SVN或Git来管理程序版本。学会使用JUnit来对Java进行单元测试。学习C语言和Java语言的coding standard 或 coding guideline。(我N年前写过一篇关C语言非常简单的文章——《》,这样的东西你可以上网查一下,一大堆)。推荐阅读《》《》《》高级深入1、C++ / Java 和面向对象我个人以为学好C++,Java也就是举手之劳。但是C++的学习曲线相当的陡。不过,我觉得C++是最需要学好的语言了。参看两篇趣文“” 和“”学习读我的 “”中所推荐的那些书至少两遍以上(如果你对C++的理解能够深入到像我所写的《》或是《()()》,或是《》那就非常不错了)然后反思为什么C++要干成这样,Java则不是?你一定要学会对比C++和Java的不同。比如,Java中的初始化,垃圾回收,接口,异常,虚函数,等等。实践任务:用C++实现一个BigInt,支持128位的整形的加减乘除的操作。用C++封装一个数据结构的容量,比如hash table。用C++封装并实现一个智能指针(一定要使用模板)。《》必需一读,两遍以上,思考一下,这23个模式的应用场景。主要是两点:1)钟爱组合而不是继承,2)钟爱接口而不是实现。(也推荐《》)实践任务:使用工厂模式实现一个内存池。使用策略模式制做一个类其可以把文本文件进行左对齐,右对齐和中对齐。使用命令模式实现一个命令行计算器,并支持undo和redo。使用修饰模式实现一个酒店的房间价格订价策略——旺季,服务,VIP、旅行团、等影响价格的因素。学习STL的用法和其设计概念
- 容器,算法,迭代器,函数子。如果可能,请读一下其源码。实践任务:尝试使用面向对象、STL,设计模式、和WindowsSDK图形编程的各种技能做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。做一个文件浏览器,可以浏览目录下的文件,并可以对不同的文件有不同的操作,文本文件可以打开编辑,执行文件则执行之,mp3或avi文件可以播放,图片文件可以展示图片。学习C++的一些类库的设计,如: MFC(看看候捷老师的《》) ,Boost, ACE,
CPPUnit,STL (STL可能会太难了,但是如果你能了解其中的设计模式和设计那就太好了,如果你能深入到我写的《》那就非常不错了,ACE需要很强在的系统知识,参见后面的“加强对系统的了解”)Java是真正的面向对象的语言,Java的设计模式多得不能再多,也是用来学习面向对象的设计模式的最佳语言了(参看)。推荐阅读《》 and 《》学习Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是学习Java的设计,如IoC等。Java的技术也是烂多,重点学习J2EE架构以及JMS, RMI, 等消息传递和远程调用的技术。学习使用Java做Web Service ()实践任务: 尝试在Spring或Hibernate框架下构建一个有网络的Web Service的远程调用程序,并可以在两个Service中通过JMS传递消息。C++和Java都不是能在短时间内能学好的,C++玩是的深,Java玩的是广,我建议两者选一个。我个人的学习经历是:深究C++(我深究C/C++了十来年了)学习Java的各种设计模式。2、加强系统了解重要阅读下面的几本书:《》了解Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验。你一定会有一种醍醐灌顶的感觉。《》这是一本看完你就明白网络编程的书。重要注意TCP、UDP,以及多路复用的系统调用select/poll/epoll的差别。《》- 这是一本看完后你就可以当网络黑客的书。了解以太网的的运作原理,了解TCP/IP的协议,运作原理以及如何TCP的调优。实践任务:理解什么是阻塞(同步IO),非阻塞(异步IO),多路复用(select, poll, epoll)的IO技术。写一个网络聊天程序,有聊天服务器和多个聊天客户端(服务端用UDP对部分或所有的的聊天客户端进Multicast或Broadcast)。写一个简易的HTTP服务器。《》信号量,管道,共享内存,消息等各种IPC…… 这些技术好像有点老掉牙了,不过还是值得了解。实践任务:主要实践各种IPC进程序通信的方法。尝试写一个管道程序,父子进程通过管道交换数据。尝试写一个共享内存的程序,两个进程通过共享内存交换一个C的结构体数组。学习《》一书。把CreateProcess,Windows线程、线程调度、线程同步(Event,
信号量,互斥量)、异步I/O,内存管理,DLL,这几大块搞精通。实践任务:使用CreateProcess启动一个记事本或IE,并监控该程序的运行。把前面写过的那个简易的HTTP服务用线程池实现一下。写一个DLL的钩子程序监控指定窗口的关闭事件,或是记录某个窗口的按键。有了多线程、多进程通信,TCP/IP,套接字,C++和设计模式的基本,你可以研究一下ACE了。使用ACE重写上述的聊天程序和HTTP服务器(带线程池)实践任务:通过以上的所有知识,尝试写一个服务端给客户端传大文件,要求把100M的带宽用到80%以上。(注意,磁盘I/O和网络I/O可能会很有问题,想一想怎么解决,另外,请注意网络传输最大单元MTU)了解BT下载的工作原理,用多进程的方式模拟BT下载的原理。3、系统架构负载均衡。HASH式的,纯动态式的。(可以到Google学术里搜一些读读)多层分布式系统 – 客户端服务结点层、计算结点层、数据cache层,数据层。J2EE是经典的多层结构。 – 就近访问,内容边缘化。,研究一下BT和电驴的算法。比如:。服务器备份,双机备份系统(Live-Standby和Live-Live系统),两台机器如何通过心跳监测对方?集群主结点备份。,使用这个技术,可以把操作系统当应用程序一下切换或重新配置和部署。学习,二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。学习。Hadoop框架中最核心的设计就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释MapReduce就是“任务的分解与结果的汇总”。HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。了解(有人说可能是一个),不过因为超大规模以及高并发的纯动态型网站日渐成为主流,而SNS类网站在数据存取过程中有着实时性等刚性需求,这使得目前NoSQL数据库慢慢成了人们所关注的焦点,并大有成为取代关系型数据库而成为未来主流数据存储模式的趋势。当前NoSQL数据库很多,大部分都是开源的,其中比较知名的有:MemcacheDB、Redis、Tokyo Cabinet(升级版为Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。写了那么多,回顾一下,觉得自己相当的有成就感。希望大家不要吓着,我自己这十来年也在不断地学习,今天我也在学习中,人生本来就是一个不断学习和练级的过程。不过,一定有漏的,也有不对的,还希望大家补充和更正。(我会根据大家的反馈随时更新此文)欢迎大家通过我的微博()和twitter(@)和我交流。—– 更新
—–1)有朋友奇怪为什么我在这篇文章开头说了web+移动,却没有在后面提到iOS/Android的前端开发。因为我心里有一种感觉,移动设备上的UI最终也会被Javascript取代。大家可以用iPhone或Android看看google+,你就会明白了。2)有朋友说我这里的东西太多了,不能为了学习而学习,我非常同意。我在文章的前面也说了要思考。另外,千万不要以为我说的这些东西是一些新的技术,这份攻略里95%以上的全是基础。而且都是久经考验的基础技术。即是可以让你一通百通的技术,也是可以让你找到一份不错工作的技术。3)有朋友说学这些东西学完都40了,还不如想想怎么去挣钱。我想告诉大家,一是我今年还没有40岁,二是学无止境啊,三是我不觉得挣钱有多难,难的是怎么让你值那么多钱?无论是打工还是创业,是什么东西让你自己的价值,让你公司的价值更值钱?别的地方我不敢说,对于互联网或IT公司来说,技术实力绝对是其中之一。4)有朋友说技术都是工具,不应该如此痴迷这句话没有错,有时候我们需要更多的是抬起头来看看技术以外的事情,或者是说我们在作技术的时候不去思考为什么会有这个技术,为什么不是别的,问题不在于技术,问题在于我们死读书,读死书,成了技术的书呆子。5) 对于NoSQL,最近比较火,但我对其有点保守,所以,我只是说了解就可以。对于Hadoop,我觉得其在分布式系统上有巨大的潜力,所以需要学习。 对于关系型数据库,的确是很重要的东西,这点是我的疏忽,在原文里补充。
感谢邀请。事实上要回答你的问题恐怕已经远远超出我的能力范畴之外了。因为对于什么样的学习才算得上“系统”几乎是一个哈姆雷特式的问题——人们很难在这一问题上达成一致。因此抛出答案几乎只是在引发更多的争议。所以在讨论这个问题的时候,我必须承认下述描述只是我自己的一点小小的体会,只希望能对你有所帮助,这些看法并不“权威”,也不完全“正确”。一般来说对于计算机科学的学生来说,下述课程是非常关键的:提醒:学习时注意把握合理的深度,不可太浮于表面,也不可太过拘泥于部分细节,对于初学着重掌握基础内容,能在概念上建立一个合理的认识就可以。真正的学习是在后面的职业生涯中完成的。一、基础篇(理论与硬件)这一部分关注的是计算机的基本理论与基本实现。包括硬件结构理论,以及软件与硬件的交互。以理论开篇,在机器语言部分深入,最终在操作系统部分达到高潮。1、计算机实现计算的原理。这包括门电路是如何实现计算的,时序电路是如何实现存储的,冯诺依曼体系结构是如何将二者结合实现了真正的现实世界的计算机的,以及它是如何反映图灵机这一理论计算模型的。其间会学习布尔逻辑。2、如何控制计算机硬件。这部分使用的“工具”就是机器语言和汇编语言。我们需要理解机器语言的本质,以及它如何以“汇编语言”这种更容易理解的形式为程序员提供了控制硬件设备的机会。这部分可以学习到很多非常低级但是本质的内容。3、操作系统是如何工作的。如果你理解了上一部分的计算机硬件相关的问题,那么理解操作系统的工作原理将不会那么困难。另外你将明白操作系统作为硬件和上层软件的中间层次,是如何大大简化了人们对硬件的操作过程的。二、进阶篇(软件系统)1、编程语言。这包括结构化编程语言以及面向对象编程语言。因为有很多选择,其实以一门语言开始即可,如果你在前面正确的理解了硬件与机器语言,那么C语言入门真是太简单了,如果你运气不好,觉得C很困难,那么即使是从Python、Javascript开始学习也没问题。重点在于理解编程中和语法相关的基本概念,并了解一些简单的算法知识。2、数据结构与算法。说白了就是如何合理的组织数据,通过其结构特点来简化编程或者提高计算的效率。这里的内容是模式化的,所有人都需要学习无序结构、有序线性结构、树结构、图结构等。另外,排序算法、查找算法必须学好,特别是算法策略如递推、递归、蛮力(穷举)、分治、动态规划等也必须有所实践和了解。切记不必深陷其中,这里是个大坑,你不可能真的“精通”他们。3、编程语言是如何实现的。这里主要涉及编译原理。当你站在高级编程语言实现者的角度再来认识编程语言本身的时候,许多问题豁然开朗。这会深刻的改变你的编程观。可惜的是即使是很好的学生在这里也会遇到很大的阻力。真正的问题不是这方面理论性有多强,而是教材都很烂——包括国外教材(什么龙书虎书鲸书都根本不是为初学者准备的),而且语焉不详。这导致大部分人都感觉莫名其妙高深莫测。如果你不是有志攀登软件设计的最高峰,可以绕行。否则从表达式运算解析开始,逐步引入变量,类型,控制结构,函数,再到对象,一步步构建出解析器,然后结合前面学习的硬件接口知识,将其转换为低级表示,最后你会发现没有那么可怕。三、基础领域篇(必备领域知识)1、互联网络是如何构成的。这部分包括网络的基本知识,主机间通信的原理,转发设备的实现,以及互联网络的构成。这是网络编程所需的基础知识。除了理解低级协议,也要花一些时间了解应用层的协议,特别是 SMTP、POP3、FTP、HTTP 等,重点是了解他们的基本原理,而不是每个细节。因为每个协议都有自己的标准,光 HTTP 协议就够你研究 6 个月以上了。这里注重的是原理。2、如何管理大量的数据并在其上建立信息系统。数据库是一个很好的例子。包括数据库系统的基本理论,实现原理,以及设计原则。同样,这里不是真的在教你如何构建一个数据库系统,而是在学习他的核心原则,重点是学会如何合理的设计表结构,以及实现效率良好的SQL查询语句。四、扩展领域篇(特定领域知识)1、基于特定平台的软件开发。如何在Windows平台、Linux平台、Mac OS平台或者手机、平板、电视机、微波炉上完成开发?这需要学习特定的软件平台提供了哪些编程接口,如何编译并部署,如何调试和测试等知识。这部分就是软件工程师职业生涯中最耗费时间的部分。2、有效的软件研发是如何实现的。这包括软件结构的设计知识,软件实施流程的管理知识,以及一些细微而繁杂的内容。人们通常用软件工程一词来概括。但事实上软件工程站的角度要更高一些,这里只是涵盖软件工程的一小部分。五、科技领域篇(研究性知识)如果你对人工智能、科学计算、图像处理感兴趣,这里还有大片的区域等待你探索。事实上,上面的描述有些吓人。每一个领域都够耗尽去很长的时间。不过好消息是大部分知识都只要求在理论上理解。真正的耗费时间的部分还是在与编程、编程、编程。不是每个人都会用到数据库系统,也不是每个人都需要懂得汇编语言。但是这些背景知识会对你有帮助。让你不再害怕,对自己更有自信。如果你希望自己成为一个很棒的开发人员,那么上述知识都是必须的。但是却依然远远不够。学无止境,计算机科学尤其如此。我说的实在太多了。思考和打字差不多耗费了我一个小时。我不太确定这些对你是否有帮助。我希望有,至少有那么一些。但我有点害怕,似乎我的描述不是在帮助你克服困难,而是制造了更多看似难以逾越的高山。但我想说:走入编程,然后走出编程。编程是为解决问题服务的,我们应当多思考想要解决的问题是什么。这会在我们迷茫的编程生涯中起到指南针的作用。它会告诉我们需要学习什么,然后由我们自己来回答如何学习。我的一位朋友是做生物科技的,他需要在海量的DNA序列里快速的进行基因片段的比较。为了完成这一任务,他学习了 Python,并着重学习了数据结构和算法相关的内容。虽然最后他写出来的程序外表看起来很简单,但是却速度飞快,为他的事业贡献了无形的资产。这就是他的起点。但是他并不满足。他继续学习如何增强程序的稳定性,如何编写更好的界面等等。现在他的软件真的非常棒,一些关键的效率相关部分已经替换为C++实现,界面也做得很专业。天啊,真的无法相信,这就是一位生物领域的研究人员自己亲力亲为的成果。即使是用苛刻的眼光来看,现在他的软件也相当不错。我举这个例子,想说明的核心在于,知识的学习,要想高效,一个广为大众所接受的观点就是应当围绕一定的具体的目标来进行。如果我们知道我们想要解决的问题是什么,那么我们进一步确定要学习哪些编程知识就会比较容易。相反,为了学而学,泛泛而看,效果通常都是很差的。只能给你留下一些大致的印象,而无法成为你真正的可用的知识。我的话说完了。虽然还有很多可以讨论的东西。但是时间所限,也许我们下次有机会还可以再讨论另外的一些观点和体会。再次感谢邀请。
看到这个问题忽然很感慨。因为我很久之前看到了一个很赞的答案,至今就抽出了这样的时间来专门实践这种自习的方法。答案来自Stack Exchange - Programmers,作者是Joel Spolsky,Stack Exchange(Stack Overflow)以及相关的一系列网站的创始人。以下是渣翻。——————原文:问:应该如何去教一个聪明但完全没编过程的人编程?内容:我被单位分配了个任务:他们要我去教一个完全不会编程,但十分聪明有能力的人编程,让他来维护我们的 .Net的程序。我确信这个人最终肯定可以学会编程,但我在寻找最短期有效的方法。我自己有些主意,但是想听听大家的意见。我知道方法可能因他想学的内容而异,但我想了解一下大概的思路。问题如下:你认为什么方法能让一个非程序员快速学会编程,到达能设计/维护程序的程度?Joel Spolsky的答案:对想要学编程的人,我一般都是推荐这种学习顺序。这种方法学的东西比较理论,但是会给你打下好的基础。全心全力学习的话估计要花3-4个月,但编程这种东西不是一两天能搞定的。如果你连这个都搞不定,你学不会编程的,不如早点放弃。方法是:读完这三本书,拼了命去读如果觉得搞不定。可以问问题,但一定在自己认真思考之后。如果你能搞定这三本书,恭喜你,你是一名程序员了。现在不管是什么《15分钟学Perl》还是书店里那些大部头的Java书,你都能搞定的。如果连这三本书都搞不定,回家洗洗睡吧,你学不会编程的。说实话,我觉得你不一定非要学C和Scheme。学习它们只是为你将来学习打下基础。这两本书都是看起来很简单(C和Scheme都是超级容易的语言),但正因如此,它们不用浪费时间教你复杂的编程语法,而是教你真正的编程思想。所以它们对于重新给你灌输正确的编程思想来说,都是不可多得的好书。试图去抄近路直接学你现在想学的东西(就像C#和)注定会失败。——————以下是个人的感想。编程中,重要的并不是语言,而是编程的思想。一旦思想学会了,语言很简单。比如自己只会Java在假期给别人写C#程序,一周就能开始写了,因为那些编程思想都是想通的。(碰巧Java和C#又那么像啦 &_&)据说,一个程序员学第n门语言的时间为(1/2)^(n-1) :1, 1/2, 1/4...Joel推荐的三本书,其中23我认为是极好的书,他自己也没对为何选1做出解释。(我自己读过1,1是一本讲硬件方面的书,如果对硬件方面完全不感兴趣,其实可以忽略。)K&R最大的优势我认为在于:1. 读完之后你再去弄Java之类的OOP,才会懂得OOP的好。2. 对于程序有更low level的认识。(反而如果从Java开始学,可能一辈子都不知道pointer是什么东西。)SICP的优势则在于:1. 让你了解Functional Programming。(很火的Clojure,Scala, F#都是FP,Java8据说也会加入FP)2. 通过FP更深地理解Algorithm和Data Structure。这也就是编程中我所说的的“核心思想”的一部分。好吧,对你,我的推荐是这三项:1. 英语2. K&R3. SICP对于英语,我的意见就是:不学英语你顶多只能成为一个一般的程序员,绝对成为不了好的程序员。看楼主应该是看得懂英语的,挺不错。把你的Ubuntu打开,开始一页一页地啃这两本书。需要的应该只有数学思维,英语,以及耐心。啃完之后如果觉得Algorithm还是不熟可以去买一本Robert Sedgewick的Algorithm补一补。不用去学CLRS,太学术...学完这些之后其实再学Python会挺好的。不用买书,直接读Python官网的Tutorial和Documentation就可以了。有什么问题,去Stack Overflow问。提问前读读这篇文章:最后具体说说。要做网站,HTML和CSS是必定要学的,但这两个在做网页app时候都不会特别难,而且不适合作为初期学习的语言,因为很难用它们来教编程思想。真正难的是Javascript。但是有了这两本书做底子,其实很容易学。去读读Mozilla Developer Network的Javascript Tutorial,开始写程序。学一个Framework,再开始写程序。回头去读读Javascript: the good parts. 回去继续写。慢慢积累,多做项目,碰到什么学什么,其实没有那么难~(我现在就是这样)如果做网站,最好还是学一学PHP,不过有了这些底子,也不会很难的。Database也得学,而且需要些时间学好,慢慢积累就成。有了这样的底子,如果要去学Java,C#也不会特别难。然后真正开始设计程序的时候,学各种library和framework也会很轻松的。我很反对一些人说你得学什么OS,Compilers,Programming Language Design之类的东西,那些如果你不搞学术也不是专门搞这些领域,没有太大必要学。当然学了肯定会让你编程的能力更上一层楼,但个人感觉只是锦上添花罢了。(因为你说你主要想做的是网页app和网站。)而且,连基础都没打好,一开始去专注学那些复杂的东西,就像天朝高中的理化教育一样,只注重于刷题和知识点,而不讲各种公式/反应背后的深层联系。一个人或许能靠刷题成为学霸,高考考个高分,但很难对理化有独特、创新的理解,也无法领略其精髓。编程也是如此,如果只注重于学手头要学的东西,或许你能学个Java做出一两个满是spaghetti code的小app,但很难做大,做精,做美,同时也很难领略编程真正的魅力。最后插一句,别相信Joel说的”C是超级容易的语言“这句话。写Readable, efficient, secure的C简直是...(略
HTML这么一坨补丁一样的东西怎能让你系统、科学地学会编程知识?再说了纵观全世界所有计算机课程,至少都包含下面的东西:1、编译原理(龙书、虎书、Parsing Techniques)2、编程语言的原理(名称五花八门,虽然SICP超简单但是从这里开始大概对你来说是没错的,后面就是各种计算模型了,什么λ-calculs,π-calculus,还有各种什么CPS变换啊、combinator啊、partial evaluation啥的,总之顺便学一下Haskell是没错的)3、操作系统4、数据库(推荐Database Management System)5、网络6、算法导论这一叠如果你有工作,每天晚上啃个两三小时的话,三四年应该可以搞定的。然后你就有资格让人给你写大程序的工作了,然后你就慢慢体会到什么是设计模式,什么是重构,什么是测试(做太多不需要维护个七八年的项目只会让你越来越烂)
前几年的一天,会用Java写Loop和Function表弟告诉我,他有机会加入公司的开发团队,人家团队是用JBOSS SEAM开发WebApp的。请我给他讲讲倒底还需要再学点什么?我花了整整一晚上的时间,给他画了一张学习路线图,还写了一份说明并标注了重点。。。。后来,他转行了。图在这儿(黄色是重点,红色是重重点),文字就不发上来了吧!
对着程序员能力矩阵炼级即可。。
考计算机专业的研究生,我当年就是这么干的。除了自学考试科目《数据结构》《操作系统》,顺带自学了《数据库原理》《离散数学》《Pascal语言》《C语言》《汇编语言》,自学《编译原理》的时候,看了两章,没看懂,觉得应该去考试验证下,就去报名考研了。然后就考上了。
计算机编程分支越来越细,想定义好系统和科学本身就是没谱的事,建议还是以需求为导向,确立一个研究方向或项目,深钻某一方面,其后获得的自信远比你无目标啃完各种教科书来的强烈
回答过这个问题了:java 自学群:,每晚统一解答问题
看了题主介绍,发现题主那个杂阿,接触不少东西,却实际上很多都不懂,或者叫做接触都比较浅。首先在答题前先亮底牌以示自己确实是一枚迷途码农。我自己本身也是毕业后自学编程,目前从事iOS开发。 题主问题 如何系统、科学的自学? 我觉得这个问题难!所限没有了学习环境,毕业了!毕业就没办法像在学校一样可以把全部时间花到学习上(这点我觉得大家都应该有感觉吧,毕业了上班了,事情多的,就算闲下来,也都不一定会把时间花在学习上,当然也有特别人爱学习,话不能说死嘛)。再来就是学习编程,语言那么多,楼主要学哪个呀,难道题主想要精通各种武林绝学,号令天下,一统江湖吗?请参考吐蕃国国师大轮明王鸠摩智,最后一心向佛。还是说点自身体会,仅仅是体会哦。一开始到公司上班,身边的同事有前端设计iOSandroidPHP还有漂亮的小编等,那时候会YY如果哪天UI我自己来,接口我自己写,iOSandroid端也我自己来,那我真是吊炸天了。那时候公司氛围很好,设计师在下班后会有Ps分享,PHP也有同事会给有兴趣的同学上课。那时候只要有分享我都去,上完基本到现在全忘记了,一门语言工作中没有经常用,给你几个月时间你可以把他忘光(我当时还参加iOS培训那时候一起培训的同事到现在基本写不了什么代码,只会写自己的老本行,因为太久没写忘得特别快),后来觉得我没有那种天赋,那种精力去获得各家绝学,没有鸠摩智那种野心,人家最后也一心向佛了。所以我还是老老实实做好我iOS本职工作,因为编程思想是相通的,好好学好一门,学有余力再学其他的上手就很快了。再来就是去哪里学,因为自己是自学的,才知道自学有多苦,其实也不算苦,真心想学是不会觉得累的,那时候的我就翻两本书,一本objective-c语法基础,一本iOS开发基础,然后网上各种找资料。天天都会看看看,活了20多年也就那几个月算的上是全身心投入学习,高考要那样还不985,211的。哎~自学的缺点就是要走弯路,没办法没人带,翻翻以前的代码那叫一个惨不忍睹。所以还是建议有经济基础的话去培训机构培训,学校回不去了嘛!新来的同事刚才培训机构出来,他们那教材整理得很不错。如果身边有朋友从事那行业,那就可以就厚颜无耻去让他教也行,不过这个会比较闹心,朋友同学有自己的生活,你天天缠着人家学也不好,除非人家真心愿意教。还有一个就是学习过程中:碰到问题,请先从网上找答案,我相信一开始都会是从白菜问题开始,慢慢的提升。一般来说基本都能找到解决方案。实在不行再请教朋友同事吧,我本人还是不是很喜欢一开始就去问,这样挺不好的。如果到了没法解决的难题的时候,我们会叫你大牛!码神!说的有点多,爪机打码真累,午饭都没吃,好像废话多了点,题主勿怪!综上回答就是:学一门自己想学的,学有余力再学其他,培训机构是首选。(如果已毕业)学习中就靠毅力了。
作为一名前金融民工的半路出家的计算系学生,有些想法想和题主分享。回答:1.了解计算机世界的体系(建议阅读计算机科学概论 豆瓣链接:)理论层:计算理论(根基是数学)硬件层:电子电路(根基是物理)程序层:程序设计(包括编译原理、各种程序语言等等)系统层:操作系统(Unix, Linux, Mac OS, Windows)应用层:软件工程(这就包罗万象不一一列举了,小到计算器,大到大数据都是应用程序)2.当你对计算机世界的宏观景象有了初步的了解,你可以在每一个层级进行学习理论层:去学习各种计算理论(信息论啊,图灵机啊,P和NP啊)硬件层:单片机啊嵌入式啊甚至是智能硬件(建议从Rasperry Pi或Arduino入手)程序层:学习数据结构、算法以及各种编程语言呀(建议语言C/Java/Python/JavaScript/Scala/Prolog,各种范型都来一个)系统层:
哦耶,请读这一本 应用层:试试自己开发各种小应用、小网站、小游戏吧。3.其实最重要的还是取决于你对自己的定位理论层:数学家?计算机科学家?硬件层:量子计算机研究人员?电气工程专业硕士?程序层:XX算法发明者?YY语言发明者?系统层:Linux内核贡献者?系统首席架构师?应用层:明星级程序员?(产品经理?)想要在哪一个层次做得出色都不是件容易的事,祝学业顺利。
循序渐进容易失去兴趣。既然你标了Python标签,那么Python是一个很好的入口。这个语言几乎是万能的,所以你可以确立一个目标,无论是写一个网站,网络应用,有界面的windows程序,没有界面的命令行程序,科学,绘图。。。总之确立一个不要太高的目标然后去做。其中有什么不懂的地方,不仅要找到答案,等到一个段落后去找原因。等到能写出一个初步的程序,这时应该能体会到理论知识不足对自己造成的障碍,然后再去看相关的理论知识可以更有效率的理解。最开始无从下手时,可以在知乎问几个开源项目,从模仿开始。
年纪有点大了(26),还是准备去德国读个三年的计算机本科
如果一定要系统的话,找个好大学,然后抄一下计算机科学与技术从大一到大四的课表,留下里面数学和计算机相关的专业课,然后去买书。
这方面应该有点发言权,毕竟教过N多新手。我觉得楼上都不太实用。我首先建议你评价下自己,创造,兴趣,学习速度里面那些比较强。如果你都不强的话我建议你趁早放弃。毕竟这条路也没多大意思。然后学习路径我不建议你学C,C++。因为对于一个没有经验的人来说,太难入门了。如果你一定要学的话,我建议你完全跳过指针以及C++的类以后的高级技术。我建议你从Java入手,如果你想学C#,那也可以。Java隐藏了一些比较难的细节,标准也比较统一,高级语言里比较简单。而shell以及python等等脚本语言又太简单,不太实用。教程我建议你完全跳过楼上那些经典教程,市面上21天学懂XXX,XXX完全解析比较适合你。原因在于经典虽然很经典,但是现在的你吸收不了,最多知道一些know how,但是不能扬弃。实际工作和这些经典很不一样的,照搬是不行的。最好就是不求甚懂,快速上手。当然你会写出无数烂的程序,当你明白烂了想写不烂的程序的时候你可以回去啃这些书,事半功倍。学完一门语言我觉得就差不多了,接下去你应该选择你喜爱的开发方向,网站,UI,APP太不一样了,你只能选择一样。想好了再继续下去。
如果不准备从事这个行业,非常不建议“系统、科学地自学编程”,这个时间成本普通人很难负担得起。换言之,我爱好音乐,“自学过笛子、口琴和吉他,请问如何系统、科学地自学音乐?”所以清晰你的目标非常重要——要达到怎样的高度,愿意付出怎样的代价?如果仅仅是做网站做APP,目前有大量的快速开发框架,搭积木一样玩儿似的,看看视频模仿就行了,UE和UI看个人天份美感,个人不建议在这上面花太多时间,模仿完全足够了。回到音乐,如果只是简单学钢琴,不一定就学五线谱,在琴键上写好1234567,还不是弹的不亦乐乎:)
多写代码多看书。给自己定一个方向,一个目标。现在移动端主要是android和ios,还有一个温而不火的html5,相比之下,安卓更容易入门,有良好的java基础就可以了,开发环境很随便。ios会更有趣,但是入门成本有点高,虚拟机和黑苹果会让你感到很恶心的。Anyway,想要系统的学习,记住,先会一点,然后慢慢会很多,朝三暮四会让你什么都得不到。Ps.勤奋最重要啦,我现在带的一些应届生,我都无力吐槽了,狗屁不通,还不肯加班学习。哎!一入码农深似海,考虑好!
你这样问,你永远入不了门。从一个你想做的网站或者应用开始,从界面设计开始,再来逻辑部分,不会就查书,查手册。不行就百度,比如说,你要做按键事件,如果你看书系统学习,什么监听器,事件,你只会越好越糊涂,直接百度相关代码或者在csdn求大牛贡献。你把产品做出来了,比你系统学完有意义。你看这么多在高校系统学计算机,是不是百分百会编程呢?最重要学会找问题,用适合自己的方法解决问题。
我觉得对于初学者或零基础的人来说,系统地学习编程就是个伪命题。首先应该找一个有兴趣的方向,比如说手机app的开发好了,快速入门。比如说android开发,有一定的java基础(没基础的随便找本市面上的java的书都行),看上的资料和例子,思考自己要做什么东西,然后快速做出成品。碰到不会做的,去google或stackoverflow上找答案。然后不断地做新的东西,或是去github上找成熟的开源项目参与进去(这个时候的你应该有能力判断那些是优秀的作品,或有能力做出『能用』的产品了)再然后,回望以前,看自己哪里薄弱的,再去系统地补充那部分知识(其实很多东西都是在碰到问题——思考——搜索——解决问题的过程中学习了解掌握的)。这时候你应该能知道自己什么方面欠缺,什么地方需要加强,以及什么方向需要更精进了
找个感兴趣的东西(比如写服务器、写IOS程序什么的),最好是比较好玩而且有些难度的。一边写一边学,需要什么上网问什么。要认识到 编程只是一门工具,不是什么武林门派。实用一点。你会发现你走的很远。最怕网上一堆人问什么”xxx牛不牛"、“怎么才算精通xxxx”、“怎么提高xxx水平“。多做一些实际的应用水平就会上来了。}

我要回帖

更多关于 编程算法基础 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信