看到一篇关于软件专业的讨论,对将要选大学专业的人很有用



APUE和UNP看不懂怎么办?

狗尾草_C:前几天京东搞活动,我就把这三本书都买了,结果还是高估了自己的功力,看了一星期都看不懂,谁能提点建议,这两套书该怎么看或者推荐一点更简单入门的书。


mephistohk :W.Richard Stevens 先生所著之书比较适合有经验的人进一步深入学习

W.Richard Stevens 先生所著的UNIX 环境高级编程、UNIX网络编程、TCP/IP详解是难得的入门好书,但这里的入门指得是研究生级别的入门。Stevens 先生所著之书多半是为了给研究生上课时用做教材,因此 Stevens 先生假设阅读这些书的人至少已经接受过了系统的计算机技术本科教育,已经拥有了比较系统的计算机相关基础理论知识。在书中 Stevens 先生假设读者拥有了最基础的操作系统理论,网络技术理论,以及UNIX理论和实践经验,并拥有数种业界常用的UNIX系统作为学习环境(在国外的大学里很容易获得),这样才能体会书中所述的细节。因此这些书刚接触时看似通俗易懂,但在阅读细节上却对读者要求甚高,如果没有足够的专业理论和系统实践是很难真正读进去的。

所以,对于没有接受过系统的计算机专业教育的爱好者,或者主要以 linux 系统维护,或以linux 桌面应用为主的普通用户,Stevens 先生的书并不是很合适的阅读对象。

因此,就我个人的看法,掌握任何一种知识都是需要投入的。我们需要花费金钱去得知识来源(花钱买书,花钱上网,花钱培训),需要花费宝贵的时间去阅读(人生匆匆几十年,没多少时间可以给我们去浪费),需要花费精力去理解书中的内容(基础知识越扎实,理解所学内容越快,但累积基础同样需要大量时间和精力),需要找到合适的环境(光看不实践心里是不会有底的)去验证自己掌握的东西。因此,如果在决定投入之前,先要摸清楚自己到底想要达到什么样的目标,这个目标是否切合自己的实际(相信一个在流水线上辛苦劳作的普通工人,即使学会了计算机编程也是没有用武之地的,除非他有机会离开流水线)。自己是否有足够的资源承载自己的理想(如对于温饱问题尚未解决之人,要他花上千上万的钱去学MBA显然是不现实的)。

同时,任何一本书都会对读者提出一个基本的知识架构和程度上的要求,比方说即使是文学博士,让他去读高能物理学方面的书也会要他的命的。因此在选择所读之书前,先要对自己的实际能力做一次详细的评估,看自己目前到了哪种阶段,是否有能力去掌握自己想要掌握的东西。千万不要因为好高骛远而勉力为之。选择适合自己当前水平的书去阅读并理解,远好过拿着大师所著的神作干瞪眼。

如果LZ确实象帖中所描述的,主要希望掌握UNIX下的编程技术,尤其是网络编程技术的话。那以我本人的经验,可以有两条路走:

1、以实际需要完善知识架构:为自己做一个项目,比方说自己写个简单的 Web 服务器,因为现在 Web 应用非常丰富,既有成熟的客户端如浏览器可以配合,又有足够全的文档如 RFC文档可供参考,再加上最基本的 socket 编程经验,就可以开始做自己的 Web 服务器。一步一步的为 Web 服务器添加流行的功能,如支持后台 FastCGI 接口,支持 WebDAV,支持流媒体等。在这个过程中不断地学习和掌握相关的理论知识,有时在发觉设计上的不足时甚至需要推翻全盘重新架构。当最终一个完全符合自己心意且足够实用的 Web 服务器做成时,就拥有了可以由自己支配和修改的服务器,同时也掌握了相关的专业理论。这种方式比较适合有一定专业基础的人使用。优点是直观,方向明确所以学习效率高。缺点是需求驱动,形成知识架构不容易完整。

2、系统掌握计算机专业理论:最好的书就是大学里的理论教科书,这些书不会去讲解过于具体的计算机应用,而是从概念开始讲起,力图使学习者获得一个完整的知识体系。只要以后碰到的工作和这个知识体系相关,自然就能很快学会。这种方式比较适合没有基础,或者希望深入学习的人使用,优点是知识架构会逐渐趋于完整,理论功底扎实,后劲足。缺点是花费时间长,方向不明确所以学习效率低,初期会因缺少实践而进展缓慢。

因为不很清楚LZ目前的计算机专业技术水平到了哪种程度,也不清楚LZ最终希望自己达到什么样的目标,所以也很难为LZ提供什么有价值的经验。如果LZ能详细描述一下自己目前的实际水平,以及希望达到什么样的目标,我也许可以为LZ提供一些建议。


狗尾草_C :我的基本情况是这样的,本科大三,通信专业,课堂里面学过的课程有C,C++,数据结构,微机原理,通信网络基础,计算机网络,交换技术。一年半linux使用经验,会shell编程,看过操作系统的书,现在正在看算法方面的书。大四打算找工作,希望从事linux开发方向的工作。
我觉得我书看了一些,但是没有编程经验基本没有


mephistohk :根据你对所学课程的描述来看,你的专业属于计算机通信专业,是多年前通过市场前景预测而设置的新兴专业,主要是培养既懂计算机又懂通信的人才。

但恕我直言,计算机通信专业既不是以信号传输为核心的电信专业,也不是以设计开发为核心的计算机硬件或软件设计专业。它在根本上其实是计算机高级应用专业,务实一点讲就是培养的是高级计算机用户。这个专业学成后既不可能从事专业程度很高的电信行业,也很难从事专业的硬件设计和软件开发。它更适合从事网络的现场安装调试,网站系统维护,或者也包括部分的网页制作等工作。

计算机软件专业和计算机应用专业的虽然都是计算机专业,但核心内容完全不同。

计算机软件专业的主要专业基础课程包括:计算机程序设计原理,计算机原理,计算机组成原理,计算机汇编指令系统,数据库原理,计算机网络原理,算法和数据结构,编译原理,操作系统原理,C语言程序设计,以及其它专业课程。

计算机应用专业的主要专业基础课程包括:计算机程序设计与实践,计算机原理,计算机网络通信基础,通信基础,数据结构,数据库应用,分组交换技术,C语言程序设计,互联网原理与电子商务理论,linux 操作系统应用与实践,Javascript 程序设计,以及其它专业课程等。

从以上课程设置可以看出,计算机软件专业注重专业理论基础的培养,力图让学生掌握完备的计算机基础理论。而计算机应用专业则设置了更多的专业课程,力图提高学生的计算机实际应用能力。这种区别是和两者的培养目的相关的,概括地说,计算机软件专业负责制造用户需要的工具,计算机应用专业负责为用户部署和维护这些工具。

而 Stevens 先生所著之书主要是供计算机软件专业所用的教科书,它并不完全适合只具备计算机应用背景的人阅读。LZ你之所以觉得阅读困难,很大程度上是因为你所学的专业过于注重应用而在计算机专业基础理论上相对欠缺造成的。

根据你的描述,你的专业甚至连操作系统原理、算法和数据结构都不是主要课程,即使你学过一些C和C++,以及unix shell 编程,但如果不能很好地掌握支持编程的环境(操作系统),没有系统学过根据目标组织程序的方法(算法),仅仅靠计算机工具的应用知识,想熟练掌握 linux 编程自然就成了缘木求鱼了。

因此,如果你确实希望以后从事 linux 软件开发工作,那我认为你现在需要做的不是马上去啃 Stevens 先生的专业著作或者其它适合深造用的著作,那是以后的事。而是趁现在还在求学阶段这个有利条件,再多选修或自修一些计算机软件专业的专业基础课,至少计算机程序设计原理、计算机组成原理、算法和数据结构、操作系统原理是必修的。有了这些专业基础理论,要想看懂 Stevens 先生的书并不困难。对以后离开大学后的通过自学自我提高也是好处颇多的。

现在你已到大三,对于应用专业而言几乎算是最后一年了,到了大四就要为以后的工作而奔忙了,希望你能抓紧这不到半年的时间,把该学的基础课赶紧学好。

狗尾草_C :感谢前辈的热心解答,前面有一点我没说清楚,我前面说的课程是和计算机相关的课程,并不是我们的主要课程,我们的主要课程是这些:

电路分析基础,信号与系统,模拟电子线路,数字逻辑及设计,高频电子线路,计算机语言与程序设计,数据结构与算法分析,微机原理与系统设计,数字信号处理,随机信号分析,信息论基础,通信网络理论基础,通信原理,电磁场与电磁波,信道编码理论基础,图像、音频、视频压缩,多媒体通信,信号检测与估值理论,通信网的安全和保密
我觉得应该象前辈所说的电信专业

前辈的所说的,计算机程序设计原理、计算机组成原理、算法和数据结构、操作系统原理我就学过算法和数据结构,其他的没学过。求前辈推荐操作系统方面的书,我觉得这是我最陌生的地方,而且很功利的说,我之前面试的时候,都问到了这方面的知识。
我还想问一下,前辈有没有个人博客,想去看看


mephistohk :首先你需要自学完计算机组成原理,这门课描述了完整的计算机系统是怎样组织起来的。学完这门课后,你就对计算机各组成部分的原理有了概念上的理解。这里需要注意的是,嵌入式应用最复杂的部分是IO控制部分,这部分需要根据实际的 ARM 模块及模块的应用方式去熟悉,而且还需要一些电子技术方面的专业课来支撑,所以先不要去接触。但大部分嵌入式应用所控制的对象比较简单,因此你可以先跳过算法和数据结构这门课,直接去熟悉工作在其上的 linux 操作系统。这里的熟悉指的是去熟悉 linux 提供的命令行工具,以及掌握内核系统调用及库函数为主,用不着去学习服务器配置,桌面应用,甚至包括数据库应用等内容,也不要马上去学习 linux 内核源码本身。你只需要能用命令行熟练操作即可。至于系统调用和库函数则需要通过编写C语言代码来完成,在这里你不需要编写复杂的应用,主要需要掌握每个系统调用的特点及使用场合,比方就 fork 来说,你不能直接简单地用 fork 派生出一个进程就完事。你需要通过编程了解 fork 调用后,进程如何处理信号,进程如何处理管道,进程和子进程之间如何相互联系,如何避免僵尸进程,新进程如何进行内存管理,更深一步还包括 fork 调用后,如果保证进程中的线程正常工作。这些东西都是你需要通过编写代码去熟悉的。用这种学习方法摸索完所有的系统调用和库函数需要1-2年的时间,正好可以赶上之后学校里学习专业基础课的节奏。到那时通过对计算机组成原理及操作系统应用的扎实理解,专业基础课学到一点就可以用上一点,会比一般的学习方法快许多。至于之后的内容如 ARM 应用模块的设计,SoA 如何裁剪之类的内容只有等你把专业技术课学完了再继续学了。

不过这里还是要再次提醒一下:计算机软件技术从本质上讲是应用数学的具体应用,因此基础课尤其是数学是最重要的,如果可以的话尽量不要荒废,而且最好还要多选修几门数学方面的课程,磨刀不误砍材功,等到因为基础扎实而在以后的学习过程中一日千里,让周围的同学们怎么也追赶不上时,我想你会理解我现在说的这一大段话的。

再次希望你三思,不要错过打好基础的机会,专业应用课程虽然学起来丰富刺激,但却万变不离其宗,是脱离不了基础课程的支持。因此忽视基础理论的培养,只注重掌握专业知识的话,就象各门各派的剑法,纵然一时看起来百花齐放气象万千,但终不免败于基础理论完整的独孤九剑之下。

希望以上的建议对你有用。

麟城寒月 :回复21楼:大神啊,求教,我是计算机科学于技术专业的,学习方向主要是编程,相应的学科如前辈所言,基本上属于技术类,重点在软硬件开发,我在大一,求教前辈,我目前除基本上会使用linux,及c语言(以下还在自学中,java,php,jsp,linux系统原理,数据库)。我想学嵌入式开发,我接下来应该学哪些呢?首先jsp,php及一些web知识属于个人业余爱好。职业爱好是嵌入式开发。我只能这么分类了,呵呵。前辈指条明路,学校的学习进度不敢恭维,同学们才开始学c语言,而我上学期就学完了。如果按学校来,我现在学的都安排到大三才学。所以前辈不用说叫我跟这学校进度来了

mephistohk :叫我大神可不敢当
根据你的描述,你现在上到大一,大一主要是学习基础课如数学分析,线性代数,概率论,物理学,通常在大一下半学期也会开始学一些对应专业的入门教程,如你所说的C语言程序设计之类的课程。
通常选择计算机专业的人士都有着极其旺盛的精力和好奇心(基于功利目的的除外),这种状态有好处也有坏处。好处是乐于吸收新知识,坏处则是容易陷于浮躁。
就我个人的看法,大一是非常关键的一年,对于工科类专业,公共基础课基本上会在大一到大二上半学期完成。由于基础课,尤其是数学课是计算机专业的基础,而且限于时间关系,通常都得不到充足的时间深化学习。因此在这个阶段,我认为不宜学习过多的专业类课程。因为针对不同基础的人,即使学习完全相同的专业内容,其领会的深度也是不同的。
简单地举例:甲只掌握以常量为研究对象的初等数学,乙掌握了以对变量的数学分析为基础的高等数学。丙掌握了以ji合为研究对象的抽象代数。假设他们一同学习C语言程序设计这门课程。
因为甲掌握的初等数学是以常量为研究对象的,因此对甲来说,C语言的内容就是几十个关键字加几百个库函数,以及顺序、迭代、选择这三种基本流程,这样甲可以很快学完C语言课程,同时也能举一反三地学会其它类似的计算机语言来完成软件的开发工作。
乙掌握的高等数学是以变量为研究对象的,因此对乙来说,C语言的内容就不光是关键字加库函数,而是由关键字构造出来的数组,矢量,矩阵,函数组成。这样乙可以直接将面对的问题解析成这些抽象的数据结构,并以合适的数据结构和函数加以构造出来,完成软件的开发工作。
丙掌握的抽象代数是以ji合为研究对象的,因此对丙来说,他首先会根据最终需要解决的问题用抽象代数来构造适合用来思考问题解决方案的代数体系。将目标域转换成高度抽象的ji合类型,如格、群、环、域、场等,再根据数学中关于这些ji合类型的定理来规约它们之间的关系,经过这样的规约后,应用领域上的问题将完全转换为数学上的问题,这样再用C语言将规约后的单元逐个描述出来,完成软件的开发工作。
从以上的例子可以看出,对于甲来说,他只能完成相对简单的开发工作,当问题复杂度大到一定程度时,他将无法对问题进行简化,最终导致开发进行不下去。所以甲只适合成为从事编码工作的编码工人。
对乙来说,他拥有一定的分析能力,可以将应用领域的问题进行一定程度的抽象,从而降低问题的复杂度,使写出的代码更精练,重用率更高,这样引入的错误自然也更少,也更容易完成工作。但乙不具备将抽象出来的对象用严格的数学工具进行检验和规约的能力,因此乙无法保证自己的写的代码在数学上是否具有完备性,所以乙经常会面临因为设计上考虑不周重构代码的麻烦。所以乙拥有一定的分析设计能力,适合成为高级程序员。
对丙来说,他完全是依靠数学领域中前人总结出来的数学规则来解决问题,这些规则都经过了纯粹数学家们的严格证明,因此只要乙对应用领域中的问题在理解上没有偏差,他就可以用数学工具来保证自己的设计在架构上不会有逻辑上的问题。所以丙拥有严谨的分析能力,适合成为系统分析员。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
两卷本的《UNIX网络编程》是已故著名技术作家W. Richard Stevens的传世之作。卷2着重讨论如何让应用程序与在其他机器上的应用程序进行对话。良好的进程间通信(IPC)机制是提高UNIX程序性能的关键。本书全面深入地讲解了各种进程间通信形式,包括消息传递、同步、共享内存及远程调用(RPC)。书中包含了大量经过优化的源代码,帮助读者加深理解。这些源代码可以从图灵网站本书网页免费注册下载。本书是网络研究和开发人员公认的权威参考书,深入理解本书内容,方能设计出良好的UNIX软件。 目录: 第一部分 简介 第1章 简介 2 1.1 概述 2 1.2 进程、线程与信息共享 3 1.3 IPC对象的持续性 4 1.4 名字空间 5 1.5 fork、exec和exit对IPC对象的影响 7 1.6 出错处理:包裹函数 8 1.7 Unix标准 9 1.8 书中IPC例子索引表 11 1.9 小结 13 习题 13 第2章 Posix IPC 14 2.1 概述 14 2.2 IPC名字 14 2.3 创建与打开IPC通道 16 2.4 IPC权限 18 2.5 小结 19 习题 19 第3章 System V IPC 20 .3.1 概述 20 3.2 key_t键和ftok函数 20 3.3 ipc_perm结构 22 3.4 创建与打开IPC通道 22 3.5 IPC权限 24 3.6 标识符重用 25 3.7 ipcs和ipcrm程序 27 3.8 内核限制 27 3.9 小结 28 习题 29 第二部分 消息传递 第4章 管道和FIFO 32 4.1 概述 32 4.2 一个简单的客户-服务器例子 32 4.3 管道 32 4.4 全双工管道 37 4.5 popen和pclose函数 39 4.6 FIFO 40 4.7 管道和FIFO的额外属性 44 4.8 单个服务器,多个客户 46 4.9 对比迭代服务器与并发服务器 50 4.10 字节流与消息 51 4.11 管道和FIFO限制 55 4.12 小结 56 习题 57 第5章 Posix消息队列 58 5.1 概述 58 5.2 mq_open、mq_close和mq_unlink函数 59 5.3 mq_getattr和mq_setattr函数 61 5.4 mq_send和mq_receive函数 64 5.5 消息队列限制 67 5.6 mq_notify函数 68 5.7 Posix实时信号 78 5.8 使用内存映射I/O实现Posix消息队列 85 5.9 小结 101 习题 101 第6章 System V消息队列 103 6.1 概述 103 6.2 msgget函数 104 6.3 msgsnd函数 104 6.4 msgrcv函数 105 6.5 msgctl函数 106 6.6 简单的程序 107 6.7 客户-服务器例子 112 6.8 复用消息 113 6.9 消息队列上使用select和poll 121 6.10 消息队列限制 122 6.11 小结 124 习题 124 第三部分 同步 第7章 互斥锁和条件变量 126 7.1 概述 126 7.2 互斥锁:上锁与解锁 126 7.3 生产者-消费者问题 127 7.4 对比上锁与等待 131 7.5 条件变量:等待与信号发送 132 7.6 条件变量:定时等待和广播 136 7.7 互斥锁和条件变量的属性 136 7.8 小结 139 习题 139 第8章 读写锁 140 8.1 概述 140 8.2 获取与释放读写锁 140 8.3 读写锁属性 141 8.4 使用互斥锁和条件变量实现读写锁 142 8.5 线程取消 148 8.6 小结 153 习题 153 第9章 记录上锁 154 9.1 概述 154 9.2 对比记录上锁与文件上锁 157 9.3 Posix fcntl记录上锁 158 9.4 劝告性上锁 162 9.5 强制性上锁 164 9.6 读出者和写入者的优先级 166 9.7 启动一个守护进程的唯一副本 170 9.8 文件作锁用 171 9.9 NFS上锁 173 9.10 小结 173 习题 174 第10章 Posix信号量 175 10.1 概述 175 10.2 sem_open、sem_close和sem_ unlink函数 179 10.3 sem_wait和sem_trywait函数 180 10.4 sem_post和sem_getvalue函数 180 10.5 简单的程序 181 10.6 生产者-消费者问题 186 10.7 文件上锁 190 10.8 sem_init和sem_destroy函数 191 10.9 多个生产者,单个消费者 193 10.10 多个生产者,多个消费者 196 10.11 多个缓冲区 199 10.12 进程间共享信号量 205 10.13 信号量限制 206 10.14 使用FIFO实现信号量 206 10.15 使用内存映射I/O实现信号量 210 10.16 使用System V信号量实现Posix信号量 218 10.17 小结 224 习题 225 第11章 System V 信号量 226 11.1 概述 226 11.2 semget函数 227 11.3 semop函数 229 11.4 semctl函数 231 11.5 简单的程序 232 11.6 文件上锁 237 11.7 信号量限制 238 11.8 小结 242 习题 242 第四部分 共享内存区 第12章 共享内存区介绍 244 12.1 概述 244 12.2 mmap、munmap和msync函数 247 12.3 在内存映射文件中给计数器持续加1 250 12.4 4.4BSD匿名内存映射 254 12.5 SVR4 /dev/zero内存映射 255 12.6 访问内存映射的对象 255 12.7 小结 259 习题 260 第13章 Posix共享内存区 261 13.1 概述 261 13.2 shm_open和shm_unlink函数 261 13.3 ftruncate和fstat函数 262 13.4 简单的程序 263 13.5 给一个共享的计数器持续加1 267 13.6 向一个服务器发送消息 270 13.7 小结 275 习题 275 第14章 System V共享内存区 276 14.1 概述 276 14.2 shmget函数 276 14.3 shmat函数 277 14.4 shmdt函数 277 14.5 shmctl函数 277 14.6 简单的程序 278 14.7 共享内存区限制 281 14.8 小结 282 习题 283 第五部分 远程过程调用 第15章 门 286 15.1 概述 286 15.2 door_call函数 291 15.3 door_create函数 292 15.4 door_return函数 293 15.5 door_cred函数 294 15.6 door_info函数 294 15.7 例子 295 15.8 描述符传递 306 15.9 door_sever_create函数 310 15.10 door_bind、door_unbind和door_revoke函数 315 15.11 客户或服务器的过早终止 315 15.12 小结 321 习题 322 第16章 Sun RPC 323 16.1 概述 323 16.2 多线程化 330 16.3 服务器捆绑 333 16.4 认证 336 16.5 超时和重传 338 16.6 调用语义 342 16.7 客户或服务器的过早终止 343 16.8 XDR:外部数据表示 345 16.9 RPC分组格式 361 16.10 小结 365 习题 366 后记 368 附录A 性能测量 371 附录B 线程入门 406 附录C 杂凑的源代码 409 附录D 精习题解答 417 参考文献 433 索引 435 ——《豆瓣读书》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值