编程学习中要注意效率和感受

早一个多月,收到了一位网友的求助信,请我帮他做一道程序题。这样的求助我是不会直接解答的。如果要想通过读程序来学习,可读的程序太多了,不在乎由我写的这一段程序。
  我给他的回信是,他可以自己做出来一个版本,无论对错,我们就他的做法进行讨论。这是我认为有效的交流。提问者没有做,靠着人给讲,这种学习方式,可以休矣。无论对错、好坏,他自己做过了,针对他自己的讨论点就出来了。我当时的答复是:
  我的时间有限,将你做过的给我发来,并提出具体问题再讨论为佳。在学习中,这种交流的方式(有一个问题,不说自己的见解,直接就找人说:“你做个答案,给我讲明白”),并不能称为交流,也不能起到什么大的作用。
  他发来了自己的版本。一个用循环可以完成的任务,但是循环体中的计算不对。我为他修改了程序,作为回复。针对他提出的疑问“当输入数值很大时,结果却为负”,我给他指点该明白一下“溢出”的问题。答复中说:
  当数值很大时,结果为负,请找资料明白int型占4个字节,意味首其最大正数可以取值为2^31-1,而不是能表示无限大的数。若计算得到的值超出了,这叫数据溢出。百度“整型 溢出”,你可以知道。
  他很重视我“布置的作业”,他翻阅了不少的书,包括经典的Bjarne Stroustrup的《The C++ Programming Language》英文版。初学者博览很有必要,但应该有种“开放”的心境,有些事情该放要放一放,留待以后解决。学习,不是一个线性的过程,而在于多次反复,同样的问题,回头看,别有风味。显然,他是一位很执着和认真的人,他列举出了好几种观点,并问“int、long int、long long int三者间究竟有何区别?”
  我给出的答复是:
  对于这四种情形,按字面“短整型、整型、长整型、长长整型”,区别在于表示数的范围,然而究竟有何不同,依平台而定。
  根据你给我看过的程序,我建议你可以暂时不必抠这样的细节,优先能用语言提供的机制能写出解决问题的程序为第一要务。语言细节的问题,你可以采用“回头看”的策略去做,而不少人,是在轰轰烈烈开始后,终结于刚起步时期的细嚼慢咽。
  如果你不是这种类型的学习者,请忽略这条建议。

  不久后,他再次来信,给的是另外一个程序。给出的程序,以及问出的问题之间,我总觉得有“跨度”。如果他会用调试手段,一跟踪,也就能自己解释通了。由于当时手头的事情很多,我给的回复是:
  近日期末加毕设,各种忙。我决定还是不为你在代码中奋战了。类似的问题,你发到CSDN论坛中,会有人很快给你出主意,比等我要快得多。
  不少急着要结果的,或者需要抠程序中细节的问题,我常这样回答。我也需要给自己时间。

  今天,在人人上看到他发的状态。可以看出,他的求助途径已经拓展了很多,他的钻研精神依然。提醒他可以注重效率,也引出了一些探讨。

  人人上的状态:

  用了一个多星期的时间写了两道题(其实是一道题),用一种很笨拙的方法解决了问题。对算法有了初印象,对向量有了更深的理解。埃拉托斯特尼筛法也成为我学会的第一个算法。真的收获颇多。越来越觉得C++难,但也越来越觉得编程是一件很有趣的事情。感谢CSDN新手乐园的各位大牛;感谢百度C++吧的诸位大神;感谢无名的印度高人。没有你们,愚笨的我写不出这个44行的程序,没有你们,我可能早就放弃了。最后,我这个笨蛋要用一颗虔诚的心膜拜Alan Mathison Turing和John von Neumann,若无你们,一切都是空谈!
  我的评论:
  我感觉你是在没有球感就在强练投三分球。这样也能练出来,但显然更艰苦。通过做一些水题”,积累一些感觉,会学得轻松、自然、效率一些,所需要成本、资源也会降下来,不再需要用意志约束自己的学习。可能有不对之处,仅供参考。
  他反问:
  那您认为应该怎么学呢?这道题是一本初级教材课后习题中的一道。我也是没想太多,就想尝试一下。您认为该选什么样的题作为练习呢?请您不吝赐教!谢谢您!
  我答复:

  一道题,一星期,效率太低了,你可以用意志强迫自己做下去,但这种感受并不全是好感受。百度一下"SMART原则",这也适合学习目标(大目标和选择题目的小目标)的确定,找让自己踮起脚跟,或者跳一跳就能够着的题目去练习。记着当前这个问题,会有一天,长高了的你,踮起脚跟就够着了。评价的标准不该是“初级课本的最后一题”,你花这么大的代价解决,说明对你来讲是难了。你做到咬住问题不放并解决,实现了一种“跨越”,很了不起,这样的精神将有助于你能在将来解决别人都无法解决的问题,这种精神不丢。我想,现在不少同学学习进行不下去,就是缺少这种精神。我还是建议你可以对自己更好一些。当然,你能这样做,并以此为乐,这是最好的了。

  重复地学习,螺旋上升,这在学习理论中的一个重要原则,而效率和感受,这是我从诸多咨询中得出要强调的。希望这位同学能坚持自己的,也能做到改进真正不当的方式。

=================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====

编程学习中要注意效率和感受

时间: 2024-08-06 21:41:18

编程学习中要注意效率和感受的相关文章

关于编程学习中一些环境变量的使用认知

在很多java相关的工具中,比如ant,maven等等,由于在编译的时候需要根据编码文件中的import引用去查找对应的jar包.通常优先会在自己的lib库中jar包,如果没有的话,就会到约定俗成的路径去寻找.通常就是系统的环境变量中去寻找可能的路径. 比如经典的CLASSPATH路径. 如下是在ant.bat中的执行脚本,默认也是到CLASSPATH制定的路径中去寻找对应的包. 所以,环境变量能够起到作用,是和整个业界的“潜规则”相关的. 经典的JAVA_HOME就是最典型的例子.如果你非要用

DirectX 11游戏编程学习笔记之7: 第6章Drawing in Direct3D(在Direct3D中绘制)(重点回顾+勘误)

        本文由哈利_蜘蛛侠原创,转载请注明出处!有问题欢迎联系[email protected]         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候,会使用章节号而非页码.同样的情况适合于"龙书"第二版. 上一期的地址: DX 11游戏编程学习笔记之6 这一章应该是本书最长的一章了,可能也是最难的一章,所以大家一定要好好消化,仔细学习!这一章大致相当于"龙书"第二版的第7章和第8章,还添加了一些别的东西. 由于这一

学编程,学单词.....在学习中积累自己的单词(不断更新__ing)

可以去肆意大话天下,可以去小民一般的言语,但是一定要清楚,知识的积累,至于心中,这样,你才能低至市井,上至高阁....畅通无阻! 1.  Loowater  厕所水 , Loo 盥洗室 学编程,学单词.....在学习中积累自己的单词(不断更新__ing),布布扣,bubuko.com

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

编程学习之如何在Node.js中优化服务器端渲染?[图]

编程学习之如何在Node.js中优化服务器端渲染?[图]在 Airbnb,我们花了数年时间将所有前端代码迁移到 React 架构,Ruby on Rails 在 Web 应用中所占的比例每天都在减少.实际上,我们很快会转向另一个新的服务,即通过 Node.js 提供完整的服务器端渲染页面.这个服务将为 Airbnb 的所有产品渲染大部分 HTML.这个渲染引擎不同于其他后端服务,因为它不是用 Ruby 或 Java 开发的,但它也不同于常见的 I/O 密集型 Node.js 服务.一说起 Nod

C语言/C++编程新手入门基础学习中链接类型

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制).创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学C++能够持之以恒C++爱好群,如果你想要学好C++最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组

网络编程学习小结

几种网络编程方式: ISAPI.CGI.WinInet.Winsock 它们之间的差别: 1)  ISAPI主要是开发基于浏览器client与server端程序.效率比CGI方式高,并且也扩展了CGI没有的一些功能.(基于TCP/IP模型中的应用层) 2)  CGI主要是开发基于浏览器client与server端程序.(基于TCP/IP模型中的应用层) 3)  WinInet主要是开发client程序.(基于TCP/IP模型中的应用层) 4)  Winsock主要是基于socket来开发clie

数据持久化编程学习总结

一.JDBC编程 1. 使用JDBC规范 在数据库编程方面,最先使用的数据持久化技术无疑是JDBC 可以说JDBC(Java Data Base Connectivity)是学习其它数据持久化技术的基础 Java中访问数据库使用的就是JDBC,基本操作有CRUD(Create-Read-Update-Delete) JDBC定义了数据库的连接,SQL语句的执行以及查询结果集的遍历,一般操作步骤如下: 1.      注册驱动:DriverManager.registerDriver(driver

JAVA编程思想中总结的与C++的区别

(1) 最大的障碍在于速度:解释过的Java要比C的执行速度慢上约20倍.无论什么都不能阻止Java语言进行编译.写作本书的时候,刚刚出现了一些准实时编译器,它们能显著加快速度.当然,我们完全有理由认为会出现适用于更多流行平台的纯固有编译器,但假若没有那些编译器,由于速度的限制,必须有些问题是Java不能解决的. (2) 和C++一样,Java也提供了两种类型的注释.(3) 所有东西都必须置入一个类.不存在全局函数或者全局数据.如果想获得与全局函数等价的功能,可考虑将static方法和stati