编程同写作,写代码只是在码字

看到一篇文章《We Are Typists First, Programmers Second》,日期是2008年,好早的一篇文章。当现在打算以一个新人的身份重新进入编程领域,或许是受《重来》的影响,或者只是在重新思考——我们究竟应该如何去编程。(转载保留:编程同写作,写代码只是在码字)

写代码只相当于写字

?或许这是一篇软文

编程这件事情实际上一点儿也不难,当我们只是在使用一个工具创造一些东西的时候,比如我们拿着电烙铁、芯片、电线等去焊一个电路板的时候,我们学的是如何运用这些工具。虽然最后我们的电路板可以实现相同的功能,但是我们可以一眼看到差距所在。

换个贴切一点的比喻,比如烧菜做饭,对于一个优秀的厨师和一个像我这样的门外汉而言,就算给我们相同的食材、厨具,一段时间后也许一份是诱人的美食,一份只能喂猪了——即使我模仿着厨师的步骤一步步地来,也许看上去会差不多,但是一吃便吃出差距了。

我们还做不好饭,还焊不好电路,还写不好代码,很大程度上并不是因为我们比别人笨,而只是别人比我们做了更多。有时候一种机缘巧遇的学习或者bug的出现,对于不同的人的编程人生都会有不一样的影响(ps:说的好像是蝴蝶效应)。我们只是在使用工具,使用的好与坏,在某种程序上决定了我们写出来的质量。

写字便是如此,给我们同样的纸和笔(ps:减少无关因素),不同的人写出来的字的差距很大,写得好的相比于写得不好的 ,只是因为练习得更多。而编程难道不也是如此么,最后写代码这件事就和写字一样简单了。

刚开始写字的时候,我们需要去了解一个字的笔划顺序、字体结构,而这些因素相当于语法及其结构。熟悉了之后,写代码也和写字一样是简简单单的事。

学习编程只是在学造句

?多么无聊的一个标题

计算机语言同人类语言一样,有时候我们也许会感慨一些计算机语言是多么地背离我们的世界,但是他们才是真正的计算机语言。

计算机语言是模仿人类的语言,从 if 到其他,而这些计算机语言又比人类语言简单。故而一开始学习语言的时候我们只是在学习造句,用一句话来概括一句代码的意思,或者可以称之为函数、方法(method)。

于是我们开始组词造句,以便最后能拼凑出一整篇文章。

编程是在写作

?编程是在写作,这是一个怎样的玩笑?这是在讽刺那些写不好代码,又写不好文章的么

代码如诗,又或者代码如散文。总的来说,这是相对于英语而言,对于中文而言可不是如此。如果用一种所谓的中文语言写出来的代码,不能像中文诗一样,那么它就算不上是一种真正的中文语言。

那些所谓的写作逻辑对编程的影响

  • 早期的代码是以行数算的,文章是以字数算的
  • 代码是写给人看的,文章也是写给人看的
  • 编程同写作一样,都由想法开始
  • 代码同文章一样都可以堆砌出来(ps:如本文)
  • 写出好的文章不容易,需要反复琢磨,写出好的代码不也是如此么
  • 构造一个类,好比是构造一个人物的性格特点,多一点不行,少一点又不全
  • 代码生成,和生成诗一样,没有情感,过于机械化
  • 。。。
然而好的作家和一般的写作者,区别总是很大,对同一个问题的思考程度也是不同的。从一个作者到一个作家的过程,是一个不断写作不断积累的过程。而从一个普通的程序员到一个优秀的程序员也是如此,需要一个不断编程的过程。

当我们开始真正去编程的时候,我们还会纠结于"僧推月下门"还是"僧敲月下门"的时候,当我们越来越熟练就容易决定究竟用哪一个。而这样的“推敲”,无论在写作中还是在编程中都是相似的过程。

写作的过程真的就是一次探索之旅,而且它会贯穿人的一生。

编程只是在码字

编程只是在码字,难道不是么?

真正的想法都在脑子里,而不在纸上,或者IDE里。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用MATLAB进行二进制费诺编码的示例代码: ```matlab % 输入待编码的二进制信号 binary_signal = [1 0 1 1 0 0 1 0 1]; % 统计二进制信号中每个符号出现的次数 symbol_counts = hist(binary_signal, unique(binary_signal)); % 计算每个符号出现的概率 symbol_probs = symbol_counts / sum(symbol_counts); % 排序符号概率 [sorted_probs, sorted_indices] = sort(symbol_probs, 'descend'); % 初始化费诺编码表 fano_codes = cell(size(sorted_probs)); % 递归构建费诺编码 generate_fano_codes(1, numel(sorted_probs), sorted_indices, fano_codes); % 初始化编码码字和编码效率 encoded_signal = []; average_code_length = 0; encoding_efficiency = 0; % 对每个二进制符号进行编码 for i = 1:length(binary_signal) symbol = binary_signal(i); code = fano_codes{sorted_indices == symbol}; encoded_signal = [encoded_signal code]; % 计算平均码长 average_code_length = average_code_length + numel(code) * symbol_probs(symbol); % 计算编码效率 encoding_efficiency = encoding_efficiency + (log2(1 / symbol_probs(symbol))) * symbol_probs(symbol); end % 输出结果 disp('原始信号:'); disp(binary_signal); disp('编码后的信号:'); disp(encoded_signal); disp('平均码长:'); disp(average_code_length); disp('编码效率:'); disp(encoding_efficiency); % 递归生成费诺编码 function generate_fano_codes(start_index, end_index, sorted_indices, fano_codes) if start_index == end_index return; end % 计算当前范围内符号概率之和 sum_probs = sum(sorted_probs(start_index:end_index)); % 计算概率之和的一半 half_sum_probs = sum_probs / 2; % 寻找划分点 split_index = start_index; sum_split_probs = sorted_probs(split_index); while sum_split_probs < half_sum_probs && split_index < end_index split_index = split_index + 1; sum_split_probs = sum_split_probs + sorted_probs(split_index); end % 生成左子树编码 for i = start_index:split_index fano_codes{sorted_indices(i)} = [fano_codes{sorted_indices(i)} 0]; end % 生成右子树编码 for i = split_index+1:end_index fano_codes{sorted_indices(i)} = [fano_codes{sorted_indices(i)} 1]; end % 递归生成左子树的编码 generate_fano_codes(start_index, split_index, sorted_indices, fano_codes); % 递归生成右子树的编码 generate_fano_codes(split_index+1, end_index, sorted_indices, fano_codes); end ``` 这段代码通过计算每个二进制符号的概率,使用递归方式构建了费诺编码表。然后对输入的二进制信号进行编码,并计算平均码长和编码效率。最后输出编码后的信号、平均码长和编码效率。 注意:这段代码假设输入的二进制信号为行向量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值