自学编程难不难系列 之 C++ ..

作者: 一了 <1liao3@funlang.org>
日期: 2016-05-05

从我自己的经历来看, 自学编程一点也不难啊. 不过有人说了, 自学要靠天份, 没天份怎么自学呢. 我的回答很简单, 没天份你学什么编程嘛, 遑论自学编程. "人生苦短, 生活美好, 要及时行乐, 咱不学编程! 乖!". 话说回来, 你说干哪行不需要天份呢?!

不过我认为多数人还是有天份的吧, 就看你感不感兴趣, 不感兴趣就很难学会. 剩下的实际上就是要克服一条: "怕!" 畏难情绪是最大的敌人! 实际上编程水平高的, 绝大部分技能是自学来的, 光靠学校学那点, 根本不够用的. 人家跟你一样, 只不过可能起步稍微容易点.

说到起步, 选择合适的入门语言非常重要, 尤其是自学者, 反正我自己就选择了最简单的汇编语言(很多人认为汇编难, 实际上是畏难情绪的典型代表, 人云亦云). C++ 算不得合适的入门语言, 甚至 C语言也不是好的入门语言. 我听过很多科班出身的人都被这两"入门"语言坑过.

我是先学的汇编, 然后是 Basic, 到 C语言时仍然觉得不适应, 反正写第一个程序, 短短的几十行, 按下编译, 几十几百条错误, 错误比我的代码都多. 说实话, 要不就是语言烂, 要不就是编译器弱智, 这比 debug 里因为偏移地址算错了跑飞更令人气馁. 好在我坚持下来, 并且喜欢上了 C, 更重要的是我能拿他编写我想写的任何程序. 汇编虽容易, 但是短板明显, Basic 短板更明显. 没有什么能比完成自己想要的功能更重要的, 语言, who cares.

不过我的编程自学路径, 实际上是当时环境的产物, 编程语言可得性成了关键的依赖, 比如 debug 在 DOS 里就有, 很容易就发现, QBasic 也是 DOS 自带的. 但是 TC20 就只能在盗版盘里发现...

但是学到 C++, 我还是有一种深深的震撼的. 第一次接触面向对象编程概念, 我想没有人不震撼吧, 高超的抽象技巧, 令人叫绝, 尤其是运算符重载, 简直重构了我的世界观哪! 对 C/C++ 的喜爱, 甚至让我形成一种偏见, 对 Basic 和 Pascal 语言特别讨厌, 很长一段时间. 当然了, 后来还是习惯了 Pascal 语法, 因为实在无法舍弃 VCL 的便利. 实际上, C系语言家族的语法相当不好, 有很多缺陷, 这是我多年观察反复推敲得出的结论. 我在设计 Nuva 和 Fun 语言语法时就舍弃了 C系语法(当然更不可能用 Lisp 类的反人类语法), 而改用更加符合自然语言习惯的语法, 向伪代码靠拢. Fun 语言则主要汲取 Ada 语言语法的优点, 具有可读, 输入, 修改方面的优点, 而且去掉了初学者很容易踩到的坑. 相信平心静气的看一遍, 你也会得出跟我类似的观点. 爱因斯坦说的一句话我非常赞同, 所谓常识, 就是你在十八岁前产生的偏见(大意).

我不会抨击 C++, C++ 是我喜爱的语言之一, 也对我产生过非常大的影响, 但是我不精通 C++, 甚至不熟悉 C++, 你也可以说我不懂 C++. 不仅仅对于 C++, 我对绝大多数我用来写过代码的语言, 都不精通, 也不熟悉, 我只用到他们特性集中极少的部分, 就像我写的第一个汇编程序一样, 数千行代码只用几十条指令. 我甚至对我自己设计的语言也不非常熟悉, 用到的地方我还是需要查手册, 哪怕手册是我自己写的 ;-)

我用 C++ 写过不少程序, 大部分都是写类库, 但是都是属于无用功, 为 DOS 环境而作. 在进入 Windows 环境, 当时能选择的实际上也就 PB, VB, VC, Delphi, 勉强能算上 Notes. 在进入软件公司上班之前, 其他的都是泛泛了解, 真正写过代码的主要是 VB, 少部分 VC. VC 写界面太蛋疼了.

下面这个程序是用 VC 写的, 为了绕开麻烦, 没用任何类库, 纯 API. 界面实际上只有一个菜单, 放到屏幕右下角的通知区内, 所有的交互都依赖于这个菜单和全局快捷键. 程序功能实际上就是记录和重放键盘和鼠标操作, 也包括录音. 对于需要反复重复的操作, 有一点用处. 当然了, 也可以拿来偷窥...不赘述...

Unconsciousness.exe

软件上比较麻烦的地方是通知栏的动画图标和冒泡提示, 当时 Windows API 公开资料上并没有这个功能, 是到处搜索找到的非公开 API 数据结构, 不过好像在 Win98 上有些功能不出来. 为了保持功能正常, Win98 的重启快捷键也被程序禁止...

我在系列文章中一再贴自己写过的程序, 并不是为了广告, 这些程序大多太老了, 是过时的玩意儿, 没有任何广告效益, 哈哈. 只是想说明一个观点, 学编程是为了完成功能, 而不是为了语言特性. 很多时候, 为了完成某项功能, 你不得不做一些妥协. 举个例子, 在做航空运输管理系统时, 因为这个系统必须要接受英文, 中文, 俄文同时输入, 而当时 Windows 98 不是 Unicode 系统, 没有俄文输入法, 我就只好自己做了一个, 而且也不是用的什么高深技术, 就是用微软提供的一个工具, 生成一个什么文件, 然后手输入内容, 编一个注册文件, 注册了即可(大意, 具体记不清).

到2002年之前, 我都是在行业外游离, 完全闭门造车, 蛮学蛮干, 靠自学掌握了多种语言在 DOS, Windows 下编程完成特定功能. 等到软件公司上班之后, 我才发现实际上当时在业界 Windows 下编写应用也差不多就是这些技术了, 我完全没有听过的技术很少.

但实际上还有一项看起来非常普通, 但是非常重要的技术, 而当时的我竟一无所知. 欲知后事如何, 且听下回分解...

附录是软件的简要使用说明:



使用说明:


1-本程序采用MSVC++6.0编制而成,在 WINDOWS2000 Professional 中编译通过,可以在 WINDOWS 95/NT/98/ME/2000/XP 中使用。不过,在 WINDOWS 95/98 中将看不到信息泡。


2-程序有两种启动方式:Command Line 方式和 Gui 方式:
  --命令行方式(Command Line):
    Usage:
	Unconsciousness -R%1	'执行 %1 后,记录一分钟的操作
	UnConsciousness -r%1	'执行 %1 后,记录三分钟的操作
	Unconsciousness -P%1	'执行 %1 后,重放以前记录的操作
    注:
	%1,指的是待要执行的文件(Exe 文件)。
	在执行完 %1 后,记录规定的时间后(或重放完毕),则自动退出系统。

  --图形用户接口(Gui):
    程序启动之后,出现一个系统托盘,在上面单击或右击鼠标,都可以弹出一个菜单来。
    注:
	系统托盘是程序的控制端,同时也将信息反馈给用户,比如通过信息泡、提示信息和图标的变化等。


3-主菜单有以下几个项目:
	Record		'记录
	Sound		'是否启用录音机
	----------------
	Play		'重放
	----------------
	Higher Speed	'调整速度(快两倍)
	Lower Speed	'调整速度(慢两倍)
	----------------
	Normal Speed	'正常速度
	----------------
	Stop		'停止记录和重放
	----------------
	Save Record	'保存记录
	Load Record	'装入记录
	----------------
	Empty Record	'清空记录
	------------------------
	Configuration	'系统设置
	------------------------
	Hide Me		'隐藏
	------------------------
	Exit		'退出系统


4-系统热健:
	SHIFT-CTRL-ALT-R	'Record
	SHIFT-CTRL-ALT-P	'Play
	SHIFT-CTRL-ALT-S	'Stop
	SHIFT-CTRL-ALT-H	'Hide Me
	SHIFT-CTRL-ALT-Delete	'显示主菜单(在 Command Line 方式下,将退出系统)


5-关于操作记录的说明(其它的参见 3、4 )
  本功能能够记录用户的鼠标和键盘的操作,在以后可以重放。但有几点需要注意:

    --在记录过程中,重放功能不可用,也不能清空记录,只有停止功能能发挥作用。

    --在重放过程中,记录功能不可用,也不能清空记录。

    --退出系统时,若正在记录,则自动停止记录。

    --在重放时,重放是按照严格的位置进行的,如果在记录和重放时,位置环境不同,将导致不可预料的情况,这一点请勿必注意!

    --在记录和重放过程中,屏保自动被关闭(WINDOWS98 的热启动健也被关闭)。

    --鼠标的滚轮不能被检测到,也就是如果用鼠标的滚轮对滚动条的操作,不能被记录下来。

    --声音的重放,跟速度无关,无论在哪种情况下,皆以正常的速度重放。

    --考虑到各种情况,现暂定最长记录长度为七分钟,到时会自动停止。

    --强烈建议:
      --尽量在窗口最大化时操作窗口,比如编辑文字和画图等,窗口最大化能让位置相对稳定。
      --如果要在多窗口中操作,要保持在记录前和重放前,任务栏的窗口数目相等。
      --在对话框等地方,不能准确定位的,尽量用鼠标快捷健。
      --在使用汉字输入法的时候,尽量用重复字顺序不变的输入法。
      --使用鼠标的时候,尽量不用滚轮。
      --如果涉及文件复制移动删除等,要考虑到记录和重放时的不同,比如文件不存在或文件已存在等。
      --总之一句话,就是尽量保持重放和记录时的环境相同,比如位置和文件等等。


6-本程序若有不完善的地方,欢迎您提出宝贵的意见和建议。


7-本文档为软件的一部分,分发时请一并保留。谢谢使用!


			Copyright(C) 张卫东,2001-12-03,北京,E-Mail: i.door@163.com