A Coder is a Poet

Kaiyuan Blog

[Zz]编程老手的那些特点,是值得新手学习的?

来自 Quora 某 CTO 的回答

作为一个经验丰富的程序员,有哪些事情是你希望在一开始编程的时候就知道的?或者换个方式来说,你认为每个新手程序员应该做或者学什么才能让自己的编程水平更好?

下面是一位 CTO Ken Mazaika 的观点,很有分享价值:

有经验的程序员会做到下面 29 项事情,这也是每个新手程序员应该知道的事情。如果你想成为更好的开发者,你应该尤其注意第 15 点和第 29 点。

  1. 积极大胆地谷歌。你得知道如何有效地组织搜索关键字,查阅别人写的代码,然后合理地用在代码里,从而解决问题。
  2. 拥抱变化,坚持不懈。老手程序员在接触新技术时,能欣然接受像个初学者一样处处受挫,并总能在完成工作的同时自学成才。
  3. 承认细节的重要性。例如变量和函数的命名、CSS 属性的命名、该用哈希还是用数组,以及其他看起来微不足道,但可能对项目有深远影响的事情。
  4. 承认大多数的『重要决定』其实并没有那么重要。一般的开发者经常在技术选型等『重大问题』上陷入唇枪舌战,而程序员老鸟们会避免浪费时间在骂战中。这一点上,他们就像禅宗大师一样(zen-like)。
  5. 选择合适的工具解决问题。网上有无数的开源库、工具和框架,让人眼花缭乱。而老手们清楚地知道针对怎样的问题,应该用什么样的工具。
继续阅读 >>

Protocol Buffer 基础:Python

前言

这篇文章为 Python 编程者提供了一个使用 protobuf 的基本教程。下文通过创建一个简单的应用,向你展示了三点主要内容:

  • 怎样在一个 .proto 文件中定义消息(Message)格式
  • 怎样使用 protobuf 编译器
  • 怎样利用 protobuf 的 API 来读写消息

这并不是一个在 Python 中使用 protobuf 的完整的教程。如果你需要更加详细的信息,可以查看 Protocol Buffer Language GuidePython API ReferencePython Generated Code Guide 以及 Encoding Reference

为什么要使用 Protobuf ?

我们接下来将使用一个非常简单的『地址簿』应用,该应用将能够从一个文件中读取某人的联系方式或将联系方式写回到文件中。在地址簿中的每个人都有一个姓名,ID,email 以及联系电话。

继续阅读 >>

OpenGL 学习笔记(一)

OpenGL 简介及环境配置

作为一个游戏开发者,如果不懂图形学渲染,那么你会很悲剧

OPENGL 简介

在开始整个学习之前,我们需要知道 OpenGL 是什么。根据 wikipedia 的定义:

OpenGL 是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近 350 个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。

这个定义告诉我们 OpenGL 本身即不是编程语言,也不是程序库,而是一个 API 标准。事实上,OpenGL 的 API 仅仅定义了若干可被客户端程序调用的函数,以及一些具名整型常数(例如,常数 GL_TEXTURE_2D 对应的十进制整数为 3553 )。虽然这些函数的定义表面上类似于 C 语言,但它们是语言独立的。因此,OpenGL 有许多语言绑定,值得一提的包括:JavaScript 绑定的 WebGL(基于 OpenGL ES 2.0 在 Web 浏览器中的进行 3D 渲染的 API);C 绑定的 WGL、GLX 和 CGL;iOS 提供的 C 绑定;Android 提供的 Java 和 C 绑定等。

更近一步讲,OpenGL 不仅语言无关,而且平台无关。其规范只字未提获得和管理 OpenGL 上下文相关的内容,而是将这些作为细节交给底层的窗口系统。出于同样的原因,OpenGL 纯粹专注于渲染,而不提供输入、音频以及窗口相关的 API。

在本文中以及后文中,我们关注的 OpenGL 实现方案均限定于 C++ 语言。

继续阅读 >>

C3 线性化算法与 MRO

理解Python中的多继承

Python 中的方法解析顺序(Method Resolution Order, MRO)定义了多继承存在时 Python 解释器查找函数解析的正确方式。当 Python 版本从 2.2 发展到 2.3 再到现在的 Python 3,MRO算法也随之发生了相应的变化。这种变化在很多时候影响了我们使用不同版本 Python 编程的过程。

什么是 MRO

MRO 全称方法解析顺序(Method Resolution Order)。它定义了 Python 中多继承存在的情况下,解释器查找函数解析的具体顺序。什么是函数解析顺序?我们首先用一个简单的例子来说明。请仔细看下面代码:

class A():
    def who_am_i(self):
        print("I am A")
        
class B(A):
    pass
        
class C(A):
    def who_am_i(self):
        print("I am C")

class D(B,C):
    pass
    
d = D()

如果我问在 Python 2 中使用 D 的实例调用 d.who_am_i(),究竟执行的是 A 中的 who_am_i() 还是 C 中的 who_am_i(),我想百分之九十以上的人都会不假思索地回答:肯定是 C 中的 who_am_i(),因为 C 是 D 的直接父类。然而,如果你把代码用 Python 2 运行一下就可以看到 d.who_am_i() 打印的是 I am A

是不是觉得很混乱很奇怪?感到奇怪就对了!!!

继续阅读 >>

编译原理之词法分析

程序设计语言是向人和计算机描述计算过程的记号。如我们所知,这个世界依赖于程序设计语言,因为在所有计算机上运行的所有软件都是用某种程序设计语言所编写。但是,在一个程序可以运行之前,它首先需要被翻译成一种能够被计算机识别的形式。

完成这项翻译工作的软件系统被称为编译器

编译型语言 VS 解释型语言

尽管在任何一门有关编译原理的课程上都会提到编译和解释的概念,但是不是每个人都能清楚地说明这两者之间的区别。下图从用户的角度给出了编译器和解释器处理用户程序的基本过程。

Compiler vs Interpretor 图1:Compiler vs Interpretor

  • 编译器读取用户使用某种语言编写的 源程序 ,并把改程序翻译成为一个等价的,用另一种语言编写的 目标程序 ,用户可以给定数据,并调用目标程序产生输出。
  • 解释器并不通过翻译的方式生成目标程序。从用户的角度来看,解释器直接利用用户提供的输入来执行源程序文件中指定的操作。

按照上面的定义,我们通常所用的 Python 是一种解释性语言,但事实上 Python 兼具了编译和解释的过程。一个 Python 程序首先被编译成为 Python 字节码,然后通过 Python 虚拟机解释执行。

继续阅读 >>

Python 常用模块记录

什么是常用函数?经常使用又经常忘记的函数就是常用函数。

下图中展示了本文内容的脉络。本文仅仅作为 Python 的使用笔记,不涉及 python 虚拟机的内部实现。

itertools – 控制迭代的模块

有句话说,当你想针对迭代器做某些操作的时候,你就应该去看看 itertools 模块中是不是有你想用的功能。如果有也相应的功能,就不要重复造轮子了,因为你实现的百分之99.99没有 itertools 的效率高。itertools 模块内的函数(或者类)都非常常用,这里只是介绍几个作为代表:

  • chain(iter1, iter2, ...):将多个迭代器连接起来,生成一个大的迭代器(使用 yield from 也可以实现类似的功能)
  • dropwhile(callable, iter):该函数从迭代器 iter 头反复调用 callable 函数,丢弃掉所有满足条件的元素,直到遇到第一个不满足条件的元素。
继续阅读 >>