怎样成为一名优秀的程序员?

2023-11-10

新加坡国立大学计算机系有两门课:CS 1101 / 1102。

几乎所有的大学计算机系课程都有两门类似的课程;但几乎所有的学生都误解了这两门课;以为前者是教C,后者是教java;但实际上前者是 Programming Methodology 后者是 Data Structure and Algorithm。

所以这两门课可以有选择,1101c 或者 1101s,使用不同的语言作为媒介。语言并不重要。

只要掌握了编程的思想、数据结构、算法,使用不同的语言去表达是很容易的。

会了很多种电脑语言后,学一门新的编程语言,几乎只要花一个晚上看看官方的语法文档就可以立刻开始使用做东西了。最多就一个星期。

基本上,那些说长时间说自己在学C#,学java的程序员,都是2B程序员,他们完全不懂得程序开发中“思想”、“数据结构”、“算法”的本质,而将大量的时间耗费在语言实现的细枝末梢中,纯粹浪费自己时间。

不同的语言会有不同的特性,有一些特性是比较重要的,普遍存在于多种语言当中的,“学习”一种新语言,实际上仅需要查看文档,看这种语言是以怎样的语法支持这些特性而已。

=========

OO是影响很广的编程概念,基本上,是Enterprise Developer(注:企业级开发者)的圣经、法则。

ED认为,越OO越好。

基本上,计算机业界有两批人,一批是真正的程序员,或者说hacker,一批就是ED。

ED实际上是企业的工具,他们很少有自己创新的想法;企业说啥米,就做啥米。所以,会有大量的vender,提供工具、支持、新技术,去train这些ED。

典型的vender有微软、IBM、Oracle等等;这些vender为了向企业推销产品,他们就经常会鼓吹一些新的“技术”,然后打包成为解决方案,推销给企业。

为了鼓吹、宣传这些技术,还有一批企业是专门在“布道”的,他们是所谓的“咨询公司”。

这样的咨询公司,他们会专门聘用一些所谓“Evangelist”,屁事不做,整天四处布道,名头都很牛逼,如XX金牌讲师。

他们实质上,就是推销员,只是,他们推销的产品,是所谓的“新技术”而已。

微软在新加坡好像就招了不少Evangelist 。每隔几年,微软所推广的技术就会“革新”一次,Evangelist们就不断的四处去宣传新技术改变了一切,能够提高效率无数倍。

Evangelist本身的技术,很多是很差的;就好像推销员本身,是不会做产品开发、不懂技术的。他们仅仅是会宣传、鼓吹新技术而已;满口各种新技术名词,但他们本身,可能仅仅只是会使用这些技术写一个Hello World。

因为他们本身素质很差,所以,他们是无法分辨他们所推广的技术本身是否好,他们只是复读机。有时候,vender本身在推的技术也其实不错,但复读机们也会把它夸张到荒谬的地步。

OO就是一个典型。

OO仅仅是无数编程模型中的一种而已,但它被过度的夸张,诠释。

Hacker们写程序,基本不会去追求程序本身是否符合OO规范。Hack这个词的意义本身就在于打破规范。

但是,大多数的ED是很笨的,他们缺乏独立思考的能力,他们需要被Train,而无法自学。Hacker的那套,他们接受不来。

所以,才会有vender / consultant / 培训学校一系列的产业,去鼓吹:

OO、XML、SOAP、Web Service、Silverlight等等一系列伪技术。

有的ED,一辈子都无法意识到他们实际上是中了vender的圈套;无法掌握真正的编程技术,而沉迷于vender们所鼓吹的“新技术”,一代接一代。

然后,只要有其中的一代技术ED没能掌握,ED就立刻被淘汰了;因为这种ED,穷其一生都没有学会真正的编程;他们仅仅是学会了一代又一代的被封装的伪技术使用技巧而已。

伪技术的典型特征是封装。

它本身没有任何新的东西,只是把旧的技术封装一下,换汤不换药而已。

OO是最好的封装技术;所以它被无底线的推崇。

封装很重要;但是,对于程序员来说,掌握封装技术本身,跟学习使用别人封装好的技术工具;是两回事。

“程序员从此不再需要关心XXX”,这是evangelist最常用的宣传语句;2B ED,看了就很高兴,然后拼命去学习新的“技术”,把他们曾经掌握的XXX底层技术给忘掉。

微软所宣传的理念被Hacker理解为“Even monkeys can code”。ED被evangelist鼓吹的新技术洗脑,最终就是成为monkey而已;所做的工作,毫无技术含量;很容易被淘汰。

所谓的程序员30岁必须转行这种说法,便是源于ED被洗脑。

这种ED,从未掌握真正的编程技术,是必然被淘汰的。

=========

而这种ED,在大学时,就是把cs 1101 / 1102理解成为教 c / 教 java的那群人。

他们,从一开始就走错了。

=========

作业(编辑说明:在技术宅和他老婆的故事中,只有女主人公完成作业之后,男主人公才会发出新课程。当然,身为看客的您可以无需完成这些作业,但如果您仍是学生,或者您正在带学生或小弟的话,倒是可以做个参考):

1. 用500字讲述什么是Programming Methodology?

2. 列举10种Data Structure.

3. 列举10种Algorithm.

【作者声明】Katze实际上是正宗计算机系科班出身,而且大学成绩甩开Wuvist九条街,这其中还包括算法、计算机架构等传统上被技术宅男垄断的科目。Katze毕业后长期于投行从事Unix服务器运维工作,故研发编码水平会被Wuvist嘲笑;但Wuvist不会写shell脚本时,绝对是第一时间向Katze求助。

Wuvist写的这系列教程以及作业安排,是为Katze量身定做的,像第1课的作业便因此会出现Perl这门研发中不常用,但在运维中却非常普遍的语言。这系列Wuvist是写给老婆的私人课程,其中充满了各种主观偏见,有缘发布到CSDN来,各位看官若看得不爽,请尽管抛砖头狠踩,但是请尽量喷得准确、到位、凶狠一些~

程序开发中,有一个著名的 80 / 20 原则。

我想,这个原则也可以适用于ED。

程序员只要花20%的努力就可以成为一个混日子的ED;80%的程序员均是如此。

但如果要成为一个优秀的程序员甚至hacker,那么,需要花多至少4倍的努力。

有什么积木可以用?积木本身是怎么做的?积木A比积木B好在哪里?

这些,是需要花大量的时间去了解。

全部都是实在的经验积累,没有捷径。

都是.NET语言,C# 跟 VB.Net的差别在哪里?对于ED,他们偶尔也会对这样的问题感兴趣,然后,他们会去看介绍,看比较文章。。。。但其实,这事完全是木有用的。

他们看了别人的介绍,以为自己懂的,但实际上,他们只是在复读而已,完全木有懂。

作为一个ED,要了解C#跟VB.Net的差别在哪里,最好的方式,就是花时间去把两种语言都学了。用这两种语言分别去写个几万行程序,然后就懂了。

当某天ED成为Hacker的时候,那就反倒可以去看各种介绍,看一眼,然后瞬间就可以悟了。

这也就是为什么很牛程序员学习新语言可以那么快,因为有太多的知识可以复用;而这些知识的积累,必然是需要通过在实际中,无数行的实际编码,无数篇的资料阅读中得来的。

没有捷径。

很多初学者,或者说,编程的伪爱好者,他们,会热衷于去四处请教大师,下载各种经典书籍,企图读一本编程圣经,然后一夜脱胎换骨。

这是,不可能的。

这种伪爱好者,永远不可能成事;在学习的过程中,抱着去“走捷径”的心态,本身就已经是入了歧途;最终会花更多的时间。

原来Ruby / 现在 Python的一个光头大牛Zed A. Shaw,为了表达“没有捷径”这样的观点,特意写了本《Learn Python The Hard Way》:
http://learnpythonthehardway.org/

甚至有一个系列:http://learncodethehardway.org/

从长远来看:The Hard Way Is Easier。

我完全同意。

作业:

1. 列举10个Python Web框架

2. Python有多少种不同的解释器?

3. Perl 跟 Python 有什么不同?

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

怎样成为一名优秀的程序员? 的相关文章

  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 某些笔记本电脑中的 VB.net Forms UI 显示问题

    我是 VB 应用程序的新手 无法弄清楚我的应用程序出了什么问题 有一个带有几个标签和文本字段的表单 当我在我和其他人的机器上运行该应用程序时 它显示良好 并具有正确的对齐和字体 然而 对于某些人来说 应用程序表单 UI 是破碎的 未对齐的文
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • Authing 正式发布应用集成网关 - Authing Gateway

    2023 年 2月 Authing 推出了身份领域的 PaaS化应用集成网关 Authing Gateway Authing Gateway 提供将原有应用快速集成到 Authing 身份云产品的能力 在扩充身份认证方式的同时 提高资源的安
  • 【OSGI】Error osgi xx Invalid value for DynamicImport-Package dynamic.import.pack

    1 背景 git下载项目 siddhi test suite 然后运行里面的测试类报错 Error osgi siddhi test suite Invalid value for DynamicImport Package dynamic
  • 计算机组成原理——存储器(一)

    存储器 一 一 存储器概述 二 存储器的分级结构 三 主存储器的技术指标 四 存储器与CPU的联系 地址总线 CPU与存储器的联系 编址方式 1 按字编址 M N 方式 2 按字节编址 五 SRAM存储器 cache 1 存储元基本结构 2
  • vue-element-admin 后台管理系统

    文章目录 前言 一 vue element admin 是什么 二 使用步骤 下载和部署 浏览模板项目代码 官网 启动 三 技术提炼 1 vue全家桶都有什么 2 vuex 什么时候用文件 什么时候直接写vue页面 导航守卫 3 组件之间的
  • 机器学习期末考试

    机器学习期末考试 一 机器学习链接 1 机器学习期末复习试卷 zhouyan2000的博客 CSDN博客 机器学习期末考试 2 机器学习笔试题 4条消息 机器学习笔试题目 北冥有小鱼 CSDN博客 机器学习题目 3 机器学习面试题 4 一天
  • 【Kubernetes理论篇】Kubernetes核心组件及资源介绍

    文章目录 一 Kubernetes架构 二 Kubernetes核心组件 三 Kubernetes核心资源 四 拓展 1 Service和Ingress的区别是什么 2 Replicaset和Deployment的区别是什么 3 Deplo
  • Flink 错误:找不到参数 evidence$ 的隐式值:TypeInformation 大数据

    Flink 是一个流处理和批处理框架 被广泛应用于大数据领域 在使用 Flink 进行开发时 有时会遇到各种各样的错误和异常 本文将详细介绍一种常见的错误情况 即在 Flink 中遇到的 No implicits found for par
  • Pycharm最新版如何设置自动换行

    1 代码编辑区自动换行 对所有文件有效 1 File gt Settings gt Editor gt General 2 找到Soft Wraps 勾选Soft wrap files 3 在输入框中添加 py 如下图所示 2 在图示位置点
  • 使用python和pyqt5轻松上手人脸识别系统(含代码)

    使用python和pyqt5轻松上手人脸识别系统 含代码 一 环境配置 1 1 python环境配置 1 1 1 安装 anaconda 1 1 2 安装pycharm 1 1 3 配置pip源 1 2 mysql数据库安装 1 3 相关依
  • Windows下,Eclipse的Android NDK(r8e) 配置

    一 关于NDK Android NDK全称 Native Development Kit 即本地开发包 1 NDK是一系列工具的集合 NDK提供了一系列的工具 这些工具对开发者的帮助是巨大的 它们能帮助开发者快速开发C 或C 的动态库 并能
  • windows怎么部署项目到云服务器

    要将项目部署到云服务器 可以按照以下步骤进行操作 1 在云服务提供商上创建一个云服务器实例 并确保已经将其配置和启动 2 在本地开发环境中将项目打包成可执行文件或者jar包 并确保项目能够正确运行 3 使用远程连接工具 如SSH RDP等
  • ctfshow萌新web17

    c传参过滤掉php 思路 include文件包含 利用日志文件包含 访问日志文件 c var log nginx access log 发现日志文件记录了user agent头 于是在该头中插入一句话木马 再访问日志文件 看日
  • AMBA总线协议AHB、APB、AXI对比分析

    一 AMBA概述 AMBA Advanced Microcontroller Bus Architecture 高级处理器总线架构 AHB Advanced High performance Bus 高级高性能总线 ASB Advanced
  • Uniapp中vueX实现登录状态功能

    uniapp使用Vuex实现登录状态的判断 退出登录 使用action commit实现登录功能 Vue use Vuex export default new Vuex Store state token userid username
  • 了解CMS(Concurrent Mark-Sweep)垃圾回收器

    原文地址为 了解CMS Concurrent Mark Sweep 垃圾回收器 一字不差的贴的人家的 就是感觉写的比较好 贴出来了 羞羞 1 总体介绍 CMS Concurrent Mark Sweep 是以牺牲吞吐量为代价来获得最短回收停
  • 使用git和maven过程一些命令

    git常用命令 1 git status 查看文件在工作目录与缓存的状态 2 git add 添加所有的文件到缓存 3 git commit m 提交的描述信息 如果我们这里不用 m参数的话 git将调到一个文本编译器 通常是vim 来让你
  • mysql5.7 leftjoin group by(获取关联表最新数据)

    用户表 users 日志表 logs 外键 user id 创建时间 created at 获取所有用户最新的日志 SELECT b from SELECT user id max created at as maxtime from lo
  • nafxcwd.lib(afxmem.obj) error lnk2005

    最近写程序突然遇到个错误 nafxcwd lib afxmem obj error lnk2005 查了下msdn发现主要原因是同时使用了CRT中的new delete和MFC中的new delete重载导致的 参考 http suppor
  • RabbitMq基本概念 = >实践DirectExchange和TopicExchange交换机模式

    AMQP 和IM的区别 AMQP 高级消息队列 1 可以一对多广播 也可以一对一广播 2 生产者和消费者不知道对方是谁 IM 1 只能一对一广播 2 生产者和消费者知道对方是谁 RabbitMQ 只是消息代理 我们不生产消息 我们只是消息的
  • 怎样成为一名优秀的程序员?

    新加坡国立大学计算机系有两门课 CS 1101 1102 几乎所有的大学计算机系课程都有两门类似的课程 但几乎所有的学生都误解了这两门课 以为前者是教C 后者是教java 但实际上前者是 Programming Methodology 后者