We keep learning little things that help us take giant steps as we go. – Donald Knuth, June 2011.
我们不断学习很少的东西,以帮助我们取得更大的进步。–高德纳
(不积跬步,无以至千里)

Funny things, displayed in reverse chronological order. 把最近鼓捣的有趣东西,按年月倒序展示在这里. 

Chinese and English mixed,and no guaranteed to ensure consistency(between two languages).
中英文混合,不保证翻译一致性。

具体的待办事项见: 计划,本篇简单记录已学会的知识。用这种方式,督促自己一直保持进步吧。


Wish List (心愿单)

  • 学会一门纯函数式的编程语言是我长久以来的心愿,比如Lisp。
  • 在算法上取得更大的进步。

系统地学好C++,就有时间满足上述的心愿了,应该也不会太远。编程语言就像是一个玩具,从学习的过程取得乐趣。但愿不会有谋生的压力,否则我自己可支配的时间也就更少了。


Table of Contents(目录)

  1. 2021
  2. 2020

2021

Annual target: Learn C++ language
Additional optional target: Learn Haskell and Lisp Books: 2021 Annual plans

年度目标: 学好C++这门编程语言
附加的可选目标: 学习Haskell 和 Lisp
本年度必读的书,参见: 2021 年度计划
学习C++的思路: 我的学习方法 。以看书为主,写博客,尽量参与开源项目学以致用。

03

#1 My Notes(已写笔记)

#2 Some concepts(一些概念的掌握)

02

#1 My Notes(笔记):
本月写的笔记太多了,不一一列举。不错的两篇列举在这里:

#2 Some concepts(一些概念的掌握)
RAII, move semantics

#3 Code snippet(代码示例):
My “complex” arithmetic type –> implement a simple comlex class C++实现复数类,为了掌握具体类型和类的常规构造方式。

2020

Annual target: :Quitting My Programming Job

I came out of comfort Zone: This year, I QUIT my job as a software developer…

This was probably one of the scariest and hardest thing that I had to do. I had a lot of moments that I was second-guessing everything that I want to do and what should I do. Quitting my software engineering job is not easy for multiple reasons, however, one of the hardest things about it is that I have to close some chapter in my life and move on and give my all to what is to come next.

To be clear I am NOT quitting software engineering, I am actually planning to do more of it.

这一年,离开了我的舒适区,做了一些过去想做但不敢做的事情。
自由了,也许自由只是暂时的。 同样也有太多的不快乐,终成过去的篇章。

2020.10

为计算机程序绘制流程图

这篇Computer-drawn flowcharts写得超级好, 难以置信它竟然是1963年的作品, 想法独到和论述严谨惊为天人. 它也对编程和调试也有帮助. 也难怪我们编程效率如此之低, 因为大多数程序员都是都是脑袋一热就开始写代码, 然后在编译时和运行时调试, 像一只无头苍蝇一样手忙脚乱.

文章给出的建议是:

  1. 准备一个创意流程图(creative flow chart),然后再准备编写代码. 在调试之前画好流程纲要(flow outline description), 通过计算机运行这个流程纲要和使用流程图程序调试流程图. 程序中几乎所有的错误都是以这种方式捕获的, 也可以清晰地看出无意义的流程.
  2. 在写任何代码之前, 先画好流程图和调试它, 然后根据这个图画编写代码. 结合1和2两种技术.

要区分编程语言和流程图语言, 并且保证流程图不被孤立.

But now that he has a more effective medium for expressing himself, our experience has indicated that he will therefore strive harder to do a better job, thus getting more satisfaction from the result. 哈哈, 从这件事中获取满足感

2020.09

双系统的小技巧: Dual Booting Ubuntu 20.04 with Windows, 这篇文章讲了怎么安装ubuntu和linux双系统,可我没用到。双硬盘的方法比较简单,直接安装windows在新的硬盘就好,然后在linux的命令环境下boot repair一下就好了。 boot repair->Steps to Install Windows 10 on existing Ubuntu 16.04

编程感悟: premature optimization is NOT the root of all evil. 过早优化不是万恶之源

2020.04

Low coupling , 低耦合。

2020.03

MapReduce

在我的电脑找到一个关于Google MapReduce的PPT, 估计是什么时候不经意间存下来的. 这个PPT出自佐治亚理工学院计算学院lingliu教授的一个课程, 她的个人主页: LingLiu, PPT下载链接: Simplified Data Processing on Large Clusters. PPT基于Google研究: 原文. 其中提到的有:

  1. MapReduce Motivation: Large Scale Data Processing. Many tasks: Process lots of data(处理大量数据) to produce other data (以生成其它数据)

  2. MapReduce Concept. IBM的这篇Apache MapReduce提到了MapReduce示例:比如多五个文件里面都记录了(地区,最大温度)的Key/Value pairs. 通过五个Map任务分别得到了不同的中间值(键值对),最终Reduce任务结合所有的中间值得到最终结果,例如:(Toronto, 32) (Whitby, 27) (New York, 33) (Rome, 38).

2020.02

整理了下自己的一些旧笔记和文档, 有个PDF叫Cmake 实践, 之前在学习Cmake工具的时候用到了它, 真的很不错. 这是我写的一个cmake的项目示例demo, 简述一下CMakeLists.txt写法: 1.约定基本的要素: 版本号, 项目名. 2. 指定源码和编译的目录 3. 使用include包含特定的目录, 以免缺少头文件依赖. 4. 致命令link目录, 以免缺少库的依赖 5.设置源码的变量 6. 使用add_来编译可执行文件或者库.

2019.12

本月学到的新东西: Memoization, Referential transparency, LSM-Tree

  • 计算机科学概念:Memoization, 维基百科的外链给出了几乎所有语言的全部实现. 这个机制是过存储(开销大的)函数调用的结果,并在再次出现相同的输入时返回缓存的结果,通过记忆来加速计算机程序。显然是以空间(需要空间一个额外的映射)换时间(函数调用的时间). 它在函数式编程中重度使用. 我原以为是硬件级别的优化, 实际上是software optimization technique, 比如Python, 它由标准库functoolslru_cache实现. 强烈推荐这个文章, Memoization in Python: How to Cache Function Results, 深入浅出, 在Python中它只是一个带缓存的装饰器.
  • 计算机科学概念:Referential transparency. 在学习Memoization时, 我了解到, 仅当一个函数是引用透明时, 才可能被Memoization(A function can only be memoized if it is referentially transparent), 关于它的概念: Referential transparency and referential opacity are properties of parts of computer programs. An expression is called referentially transparent if it can be replaced with its corresponding value without changing the program’s behavior. This requires that the expression be pure, that is to say the expression value must be the same for the same inputs and its evaluation must have no side effects. An expression that is not referentially transparent is called referentially opaque. 编程时, 我们应始终清醒自己的代码是否是引用透明(没有改变程序自身的行为). 想要了解更多, 推荐SO上的一篇文章:functional programming - What is referential transparency (Prof. Uday S. Reddy, University of Birmingham). 这篇文章写的挺幽默的, 比如: Strachey would be turning in his grave.(译:Strachey的棺材板要压不住了)
  • Python Decorators 虽然我经常使用装饰器, 但是我从没有自己实现过, 准确说, 我并不清楚在何种条件下应该使用它. 我需要再了解更深入, 以确保自己在编程中实践中得心应手地使用. I must get my hands dirty.
  • 课程: Principles of Programming Languages, 在了解Referential transparency概念时, 意外看到了Prof. Uday S. Reddy 教授的一个课程, 它似乎有点意思.
  • 论文:The Log-Structured Merge-Tree (LSM-Tree), LSM-Tree是为了解决高性能事务系统历史记录表的索引问题.基于磁盘的索引结构比如B树有双倍的I/O消耗.LSM Tree实现了以极低的开销实现了实时索引(real-time index).