`

Typical Chinese Programmer

阅读更多

FatMouse 在 Java 课上介绍了 Typical Chinese Programmer 的概念。我不知道这个名词从何而来,在 Google 上似乎也没有找到有用的信息。不过 FatMouse 说 Typical Chinese Programmer 是这样的一类人,他们想当然地写程序:

  • 比如,他们做出来的界面上有一堆按钮,他们假定用户会先点击“按钮一”,再点击“按钮二”然后是“按钮三”。如果用户不按照这个顺序点击,那么程序就会莫名其妙地 Crash 掉。然而他们也并没有给任何提示给用户以说明点击顺序,或者是在第一个按钮点击之前禁用掉第二、第三个按钮,因为他们认为用户一定不会笨到不按照他们心里想的顺序去点击按钮的。
  • 再比如,他们打开文件从来不判断文件是否打开成功。“怎么会打开失败呢?”他们这样想。他们觉得,每次都检查是否打开成功实在是太麻烦,打开失败的概率实在太小了,要真的打开失败了,就到时候再加上判断语句吧。

于是,他们写出来的程序里面充满了不确定因素。

我最近两天都在调试一个 C++ 程序,后来发现有一次错误就是由于队友犯了 Typical Chinese Programmer 式的错误造成的。

程序是由 Qt 搭建而成的。最开始发现了一个极其棘手的 Bug ,我在我的 Linux 极其上根本无法重现这个 Bug ,但是在队友的 Windows 机器上则很容易重现,要命的是,如果启动调试模式,则很难碰到问题,如果是直接运行,则必定出问题。在 Windows 下 GUI 程序输出到 stdout 、stderr 之类的东西都看不到,又不能启动调试器,实在是很无奈。问题出在 GUI 线程被 freeze 掉了,后来发现其实所有的线程都 wait 了,而调用堆栈上显示的是 Qt 在 emit 一个信号的时候进入锁定状态。

从 Qt 4 开始支持多线程之间传递信号,它使用一个 Queue 的机制来传递多线程之间的信号,而程序在 Linux 版的 Qt 下运行得很好,到 Windows 下就立即死锁,我又把队友们的程序整个浏览了一遍,觉得都没有哪里会出现把 GUI 线程锁掉的情况,就不得不怀疑是 Windows 版的 Qt 在这里可能会有 Bug ,可惜我也没有搜索到有用的 Bug 报告一类的。

最后我手动指定 Qt 即使在多线程之间传送信号也不使用 Queue 的方法,然后改动了一下同步,尽量避免线程之间直接调用信号槽会造成的问题。之后 GUI 线程就不会死掉了。不过程序的功能仍然有问题。一个本该被 wake 起来的线程根本没有醒过来,这个线程一开始打开一个文件,然后 wait ,等待别人把它 wake 起来,然后对文件执行一些操作。

经过多次尝试,我们发现程序打开 mp3 和 avi 文件都不行,但是可以打开压缩包。实在是非常郁闷,最后我们把 mp3 打包为压缩文件,发现也不行。终于发现原来所有的影音文件都放在一个路径包含中文的目录下,而压缩包的路径里没有中文。而队友在打开文件的时候由于编码问题 (Qt 内部使用 unicode 编码) 打开含有中文路径的文件失败,但是他却没有做任何判断!导致线程里面直接出错,根本没有 run 起来,就更别谈 wake 了。

总之不管 Typical Chinese Programmer 这个词存在不存在,在真实项目中尽量写出健壮的程序实在是非常必要的,要不然大半的时间就要在痛苦的调试中渡过了。

分享到:
评论

相关推荐

    ftpd-typical.xml

    ftpd-typical.xml 用于ftpserver 配置说明

    Typical_100.cpp

    Typical_100.cpp

    Typical states and density matrices.pdf

    在量子力学中,量子态是描述物理系统状态的关键概念,而密度矩阵是这些状态的数学表示,尤其在处理混合态时至关重要。这篇由G.W. Gibbons和D.A.M. Thomas在1992年发表的文章《典型状态与密度矩阵》深入探讨了如何将...

    cpp-typical基于高度可组合类型的C模板元编程库

    cpp-typical是一个基于C++的模板元编程库,它的核心理念是提供高度可组合的类型工具,以增强C++的元编程能力。在C++中,模板元编程是一种在编译时进行计算的技术,它允许程序员创建能在编译期间生成代码的模板。...

    C++ AMP for the DirectCompute Programmer

    DirectCompute draws a sharp distinction between the code that runs on the host (typical C or C++) and the code that runs on the device (C-like HLSL kernel code). The host code and the device code ...

    PyPI 官网下载 | typical-2.0.0b22-py3-none-any.whl

    "PyPI 官网下载 | typical-2.0.0b22-py3-none-any.whl" 这个标题表明我们关注的是一个在Python Package Index(PyPI)上发布的软件包。PyPI是Python社区的官方仓库,用于存储和分发Python软件包。这个特定的包名为...

    Python库 | typical-2.0.29-py3-none-any.whl

    标题中的"typical-2.0.29-py3-none-any.whl"就是一个Python库的轮子文件(wheel file),它是Python包的二进制分发格式,旨在简化安装过程。 首先,我们来理解一下"typical"这个库。尽管在Python生态系统中,...

    Python库 | typical-2.0.0b8-py3-none-any.whl

    "typical-2.0.0b8-py3-none-any.whl" 就是这样一个Python库的轮子文件,它代表了一个特定版本的typical库,版本号为2.0.0b8。 首先,让我们深入了解一下Python的.whl文件。.whl是一种二进制分发格式,它是Python的...

    信号与系统教学课件:4-3 Frequency spectrum of typical signals.ppt

    《信号与系统》教学课件第4-3部分主要探讨了典型信号的频谱,具体涉及以下几个关键知识点: 1. **连续时间傅里叶变换(CTFT)**:CTFT是将时域信号转换到频域的一种分析工具,用于描述信号在频率上的分布。...

    jspdaoguestbook_java_dao2006com_typical3xe_

    7. **版本控制**:"typical3xe"可能表示这是该系列的第三个典型版本,这可能意味着代码经过了多次迭代和改进,对于学习代码演化和版本管理也具有参考价值。 8. **项目结构**:通常,一个完整的Java Web项目会有一个...

    typical:接口定义语言

    典型的 典型的是接口定义语言。 安装 简易安装 如果要在x86-64 CPU上运行macOS或基于GNULinux,则可以使用以下命令安装“典型”: ...例如,以下将把Typical安装到工作目录中: curl https://raw.githubusercontent

    inscrfctions-typical.rar_mimo

    The typical application of MMSE algorithm for MIMO and OFDM channel estimation, contains detailed instructions

    06 Typical Processes in FusionCloud 6.3 Scenarios.pptx

    06 Typical Processes in FusionCloud 6.3 Scenarios.pptx

    yellow River Estuary typical wetlands classification based on hyperspectral

    ellow River Estuary typical wetlands classification based on hyperspectral derivative transformation

    adc_dma.zip_dsp adc_dsp adc实例_nailsssz_typical999

    在本文中,我们将深入探讨与标题“adc_dma.zip_dsp adc_dsp adc实例_nailsssz_typical999”相关的技术知识点,主要关注DSP(数字信号处理器)如何利用ADC(模数转换器)功能以及相关实例。描述指出,这是一个包含...

    UART.rar_UART VHDL_no key_typical7mc_uart

    下面将详细介绍UART的基本原理、VHDL实现的关键点以及与"no_key"和"typical7mc"相关的知识点。 UART基于异步通信协议,它不依赖时钟同步信号来传输数据,而是依靠起始位、数据位、奇偶校验位和停止位来识别数据帧的...

    Chinese Agricultural Natural Risks and Real Background of Uncertainty

    Chinese Agricultural Natural Risks and Real Background of Uncertainty,王健,,The agriculture is a typical risk industry. The agricultural risk can be summed up two big kinds roughly. One involves ...

    ADS285 Typical Application

    ### ADS1285 32位Delta-Sigma ADC在地震学应用中的典型配置 #### 概述 ADS1285是一款专为地震学设备设计的32位低功耗模数转换器(ADC),它能够满足低噪声高精度数字转换以及延长电池使用寿命的需求。...

    2017_2018学年高中英语每日一题第01周aim和typical的用法试题含解析新人教版选修6

    【aim】和【typical】这两个词在英语中是非常常见的,尤其在高中英语学习中扮演着重要角色。它们分别表示“目标”和“典型的”含义。 1. **aim**: - **名词形式**:aim 可以表示“目标”或“目的”。例如,...

    EVALUATION OF ENVIRONMENTAL IMPACT OF TYPICAL LEATHER CHEMICALS. PART I:BIODEGRADABILITY OF FATLIQUORS UNDER ACTIVATED SLUDGE

    皮革行业作为众多发展中国家经济的重要组成部分,不仅在就业和出口方面起着关键作用,同时也因其排放大量的液体和固体废物而日益受到环境影响的关注。皮革加工过程中通常需要使用大量的化学品以确保皮革的质量,但...

Global site tag (gtag.js) - Google Analytics