作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

计算机很早就走入了我的生活。小学时,家里放一台联想“天琴”的电脑。它霸气的音箱造型,拉风的麦克风,诡异的遥控器,都震撼着我小小的心灵。那时的小屁孩,会花一个下午,努力研究左键、右键和开始菜单。初中时,游戏成了电脑的代名词。在报摊买大众软件,在商场地下室买碟,在家里输入一下午的"show me the money",乐此不疲。到了高中,电脑和网络相连。上网看新闻,泡论坛,阅读最早的网络文学,再加上小小的下载窗口。在网吧里待一夜,染上满身的油烟味,早上再战战兢兢回家,似乎是叛逆期最深的记忆了。

然而,这都是门外汉的徘徊。我始终没有踏入计算机的大门:既没有计算机相关的学历,也没有在IT业的工作。想想自己这些年在大门外晃来晃去,和计算机失之交臂的经历,也觉得有趣。聊作此文,博客官一笑。如果你也是和我一样徘徊的门外汉,希望我的学习经历能对你有些参考价值。

编程就是Debug

或许是之前玩电脑太凶,所以就把电脑当作纯粹的娱乐工具。大学时坚决选了个和计算机靠不上边的专业:物理。为了向父母表示拳拳的向学之心,自己连电脑都没带,就屁颠屁颠的研究欧拉方程去了。

但门外汉最开始接触编程,还是来自本科的课程。本科时有五门和计算机相关的课程:

  • C语言。使用的是谭浩强的《C程序设计》。对教材不置可否,但这门课给我的印象是:程序员就是解决bug。再也不想转系到计算机学院了。
  • 算法与数据结构。当时的教材是高教版的《算法与数据结构》。书里的例子使用的是伪代码。现在觉得这不算差,但当时上机的时候总是一堆bug要改。对C语言不算熟练,所以很多bug不容易解决。
  • Fortran。教材是《FORTRAN语言》,谭浩强是作者之一。这是门古老的语言,但在科学运算方面运用很广,所以作为理科生必须要学习。和C语言给我的感觉类似,就是要不停的debug。痛苦极了。
  • 微机原理。教材是《微型计算机原理与接口技术》。主讲硬件原理和汇编语言。当时用UltraEdit加插件,来运行汇编语言。学习汇编时,也只是试着用了用加法、移动之类的语法,没有具体的项目。
  • 数据库。教材是本绿皮的,题目忘记了。还能记住的,就是不断分拆关系型数据库的表格,直到它满足某个范式。基本上没有太多实践。

回顾大学的这些课程,其实都算是计算机科学中相当重要的内容。问题是,这些课程都比较基础,偏理论,却轻实践。教材和老师的讲解也是如此,对于年轻人来说,乐趣少了些。具体的项目基本没有,自己很难看到效果。一时看不出这些课程的用途,就为了应付考试,将就的学吧。大好时光,还是挥洒在篮球场上吧。

大学期间还是出于兴趣,看了些Java和web的内容。Java看了《Core Java》的第一卷,但自己没有电脑,没法实践。还没把握到面向对象的精髓,就被轰然到来的期末备考裹挟走了。为了给女孩子惊喜,跟着w3cschool的教程,尝试做网站。学了html,css和php,但没钱租服务器,最后做了俩静态页面,差强人意。窘迫的年轻人。

创造才是乐趣

大学最后一年做毕业论文,阴差阳错,选了个三维重构流体运动的课题。这和计算机图形学沾上了边。当时用IDL来做图形处理和矩阵运算,可以很快看到算法对图形的处理效果。我一下子来了兴趣,连着两个假期都扑在这上面。空闲的时候,也是调程序、实验算法,看看结果如何。尽管导师评价代码太乱,不适合搞计算机,自己也是嘿嘿一笑,依然乐在其中。为了解决问题,自己还学了不少计算机图形学的内容,比如《图像处理、分析与机器视觉》。果然,兴趣是最大的学习动力。

在这期间,另一个重要的变化是接触Linux。为了做课题,我把自己的笔记本带到了学校。三年不见,这个本已经从曾经的“高富帅”变成了“矮挫熊”。听从朋友的建议,忍痛把操作系统换成了Ubuntu,以减少死机的次数。网上填个表,就有一张免费的cd寄到,顿时体验到开源的优越性。用了一段时间,总体感觉是,免费的果然差一些。比如Ubuntu上的办公软件就差office好多,更别说做的惨不忍睹的游戏了。唯一方便的是,学校里有一个Ubuntu镜像,所以可以以无比迅速的节奏来下载更新或者安装应用。真正享受Linux,还要等到未来。

需求的倒逼

本科毕业时,那所大学校园里快要溢出来的科研气氛给我打了鸡血。内心想的纯粹是搞科学研究。所以没怎么犹豫,就开始读博了。做的课题是流体计算相关的,因此需要在高性能电脑上并行运行。

高性能计算机的运行环境和普通电脑完全不同。首先,它安装的是CentOS,还没有任何的图形华界面,文本方面基本用vim。其次,由于要和别人竞争使用,要比较清楚的估计自己的工作量、所需的CPU数目和运行时间,还要查看空闲的资源,见缝插针。一个任务交上去,短的跑几天,长的跑几个星期。懒惰是创新的动力。为了不操那么多心,就写了些bash脚本来处理这些繁杂的事务,或者监视集群的运行状况。这才意识到bash和Linux工具(比如sed, awk, grep...)的好处。这期间读了《Linux Administration Handbook》,非常全面的一本Linux参考书,写的也很有趣。最后,高性能计算机是个并行的集群,需要了解并行算法和接口,所以读了《Parallel Programming with MPI》。

仅仅了解Linux的管理是不够的。在计算机上运行的是数值模型。这些数值模型是C语言和Fortran混合编写的。为了理解程序,认真读了《The C Programming Language》,《Expert C Programming》,《Fortran 90/95 for Scientists and Engineers》。这几本书的好处是简洁且重点清晰,读起来不费劲。然而,在集群上的编译连接很成问题。主流的编程可以依赖StackOverflow。但数值运算的很多问题太偏门,在网上找不到资料。一封询问邮件发出去,基本得不到什么有用的回应。几番折腾下来,心里发狠,还不如自己读源代码,自己解决问题。因此读了《Advanced Programming in the Unix Environment》(好一本厚书,读的过程不堪回首,读完真的学到很多)。这些基础知识帮助我解决了不少编译连接方面的问题。

数据处理是另一个问题。在工作最开始使用的是Matlab,但研究所里的许可证有限,有时要等到别人用完了才能去用。再加上Matlab的许多附加包价格不菲,也让我觉得不方便。有一次和教授聊起这个问题,教授说,那你可以试试Python。Python,以及Python下的Numpy和Scipy包可以满足我的需求。而且想想,Python是免费的,这无论对我,还是对未来可能雇佣我的研究机构来说,都可以省下笔钱。这么看,学Python是个蛮靠谱的事情。《Learning Python》是本很全面的Python教材。

写作的动力

出于分享Python心得的目的,也为了打发空闲的时间,开始在博客园写“Python快速教程”。写到标准库,发现Linux系统知识是必备的背景知识,所以重开了“Linux的概念与体系”系列。另一方面,在写网络相关的包时,发现自己对网络协议方面了解太少。《TCP/IP Illustrated》里有对网络协议非常全面的介绍。这里面学到的东西,也构成我的“协议森林”系列的文章基础。自己的文章得到认可,也更有动力去多看多学了。

在和其它博主交流时,感觉到自己在基础知识方面,还是有很大的差距。毕竟自己是个非计算机专业的“杂牌军”。一是对面向对象的本质了解不够,这在《Thinking in Java》里脑补了一下。二是算法和数据结构的知识太肤浅,因此基于《Data Structures and Algorithm Analysis in C》,自己实现了一系列的经典算法。三是没有设计数据库的实际经验,正在努力做一个项目,来获得实际经验。看看这三点,都是本科时候学残了的课。不是不报,时候未到啊。

门外汉的徘徊

从小屁孩时,拿着鼠标小心翼翼的点“开始”,自己还真的时徘徊了许久。幸运的是,人生几个转弯下来,我依然喜欢编程,喜欢静静的计算机打交道。有一件两件真心喜欢的事情,就是很大的幸福了。和许多专业的计算机人士相比,我依然是一个门外汉。这种门外汉的徘徊,其实感觉不坏。作为门外汉,没有要成为最好的负担,只用随心所欲的享受技术和写作。

作为门外汉,好的技术书和好的工具会有很大的影响。毕竟,门外汉说来就来,也说走就走,很容易一时的不享受而放弃。不能不说,是那些文辞优美又简洁的技术书,让我感受到编程的优美。而Ubuntu下方便免费的编程环境,铺平了自由尝试的道路。现在更方便的是,我们可以在互联网上找到各种各样的教程、资料和公开课。许多云平台工具也是免费的。所以,即时是门外汉,也可以很容易跨过那道大门。这是门外汉最好的时代了。

最后附一张图,开启我门外汉生活的电脑:

门外汉的IT的更多相关文章

  1. 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制

    第一部分 基本设计 目前最新版本的C#驱动MongoDB-CSharpDriver-2.2.3,比之前的版本更新比较大,在网上很难找到这个版本的相关C#操作资料,以下都是个人自发研究.测试的,如有雷同 ...

  2. 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制之 第二部分

    第二部分 尝试解决BulkWrite(List<WriteModel<T>>)问题 在上次发表的文章中,得到了一些很好的反馈,真切体会到写博文的好处,有高人指出两大问题,具体可 ...

  3. 排序算法门外汉理解-Shell排序

    #include <stdio.h> /* 希尔排序 基本思想:希尔排序又称为缩小增量排序,对简单插入排序的优化. (外部分组gap,组内部插入排序! ! ) 特点:一种不稳定的排序 */ ...

  4. 一个门外汉的理解 ~ Faster R-CNN

    首先放R-CNN的原理图 显然R-CNN的整过过程大致上划分为四步: 1.输入图片 2.生成候选窗口 3.对局部窗口进行特征提取(CNN) 4.分类(Classify regions) 而R-CNN的 ...

  5. IDC门外汉-单线、双线、智能多线、BGP的区别

    一.单线在此不多说,不是电信,就是网通机房,是,2005年前的机房情况: 二.双线:上般是从2004年到2008年用此方法较多,此今还有不少在用此法如下: 双线主机 有单IP和单网卡双IP地址,双网卡 ...

  6. 从门外汉到腾讯Android高级研发——一个半路出家菜鸟的艰难逆袭之路

    我是在去年3月份加入腾讯公司,目前是腾讯公司某技术部门里面的一个小负责人,年薪月薪大税后概30K,谈不上多么厉害,但在回想自己半路出家学习编程,从一个销售到现在终于进入中国互联网顶尖公司,还是有些许感 ...

  7. 网络通信IO的演变过程(二)(一个门外汉的理解)

    2.NIO 当与别人谈论NIO时,一定要弄清楚别人说的NIO是指哪个含义? NIO有2种含义: 1.NonBlocking IO,基于操作系统谈 2.Java New IO,基于Java谈 我们这里主 ...

  8. 网络通信IO的演变过程(一)(一个门外汉的理解)

    以前从来不懂IO的底层,只知道一个大概,就是输入输出的管道怼到一起,然后就可以传输数据了. 最近看了周志垒老师的公开课后,醍醐灌顶. 所以做一个简单的记录. 0 计算机组成原理相关 0.1. 计算机的 ...

  9. 马里奥AI实现方式探索 ——神经网络+增强学习

    [TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...

随机推荐

  1. C#调用WebService

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  2. BZOJ4455: [Zjoi2016]小星星

    Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细 线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这 ...

  3. Xilinx下载安装与在win10闪退问题解决方法

    Xilinx的14.4版本的下载链接(百度云的上传了N多次都提示失败,所以就换了360云盘上传) https://yunpan.cn/cPHKLjbX9RueM (提取码:2a5a)下载后解压到以下目 ...

  4. bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)

    题目大意:一棵树,以一定顺序走完n个点,求每个点经过多少遍 可以树链剖分,也可以直接在树上做差分序列的标记 后者打起来更舒适一点.. 具体实现: 先求x,y的lca,且dep[x]<dep[y] ...

  5. 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版

    目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...

  6. 大白话讲解Promise(二)理解Promise规范

    上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...

  7. 每天一个linux命令(23):Linux 目录结构

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  8. 大叔最新课程~MVC核心技术剖析

    <MVC核心技术剖析介绍> 主讲:仓储大叔 时间:2016-12-04 20:30分 MVC各层分工 Http请求的过程 如何查找Action 如何渲染视图 ViewModel,DTO,D ...

  9. Oozie分布式任务的工作流——Sqoop篇

    Sqoop的使用应该是Oozie里面最常用的了,因为很多BI数据分析都是基于业务数据库来做的,因此需要把mysql或者oracle的数据导入到hdfs中再利用mapreduce或者spark进行ETL ...

  10. FASTJSON

    package com.hanqi.test; import java.util.ArrayList;import java.util.Date;import java.util.List; impo ...