专业学习的认识与思考

专业学习的认识与思考

我的思考

​ 经过为期一个学期的计算机导论课程的学习,让我对计算机科学与技术这门学科有了更加清晰的认识和和思考。有人说:计算机导论就像“计算机近代史课”。是有那么点意味。但是我认为这门课程更多的像是提供了很多很多的学习导向,如若以历史视之,则难得真知;相对的,如果将其视为实验指导课,并将指导内容一一实践(当然那肯定会花大量的时间还有可能做不出来),那一定受益匪浅。以下便是我(以下均用“本文”)的结论:计算机导论须躬行。

关于抽象、理论和设计能力

​ 在计算机科学有技术这门课程的学习中,我们的计算机能力必然会受三个方面能力的影响:抽象能力、理论能力和设计能力。抽象能力顾名思义就是及那个纷繁复杂的事物中提炼本质的能力,它是一个将对象转化为类的能力。在项目实战中,这样的能力有助于开发者将问题本质化,大大降低问题的复杂度。理论能力在计算机这门学科当中——我认为是至关重要的,只有掌握了相关的理论知识才能对项目本身的开发“有的放矢”。设计能力的好坏直接影响了整个程序的开发思路、开发速度和最终程序的完成效果,同样至关重要。下面我以汉诺塔这一例子对三种能力进行实例论述。

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

我们可以将问题抽象为高度为2的汉诺塔从a柱移动到c柱上,b柱作为辅助柱,于是我们可以将a柱最顶层移动到b柱,然后将a柱现在的最顶层移动到c柱子,最后将b柱的最顶层移动到c柱完成整个操作。

对于编程语言来说,我们可以把上述三种移动抽象化并且归类,在汉诺塔只有两层的情况下,每一次移动因为意义上的不同都可以视为一种类别:因为最后一次将b最顶层移动至c最顶层的操作是一样的,所以我们将其视作公共类;将第一次a顶层移动到辅助柱b作为辅助类;将第二次由a移动到c的操作视为目标类。这三种分类将三种看似相同而又不同的操作抽象并有目的地类聚起来,以便运用计算机中的递归思想将复杂问题用很简单的程序解决:

def move(n,a,b,c):
    if n==1:
        print(a,'上圆盘挪到',c,'上')
    else:
        move(n-1,a,c,b)   
        print(a,'上圆盘挪到',c,'上')
        move(n-1,b,a,c)   
n=input("汉诺塔有多高:")
n=int(n)
move(n,"a","b","c")

output:汉诺塔有多高:2
	   a 上圆盘挪到 b 上
	   a 上圆盘挪到 c 上
	   b 上圆盘挪到 c 上

在这个问题的解决方案中,本文提到最多的就是“抽象能力”,抽象能力似乎是这三种能力里最重要的一种能力了,然而真的是这样的吗?经过这学期的计算机导论的学习,我深刻意识到一个程序的开发好比人“拈弓搭箭”,程序设计者运用其设计能力构造整个程序的框架和思路,并且找出程序设计需要的技术等,好比为拈弓搭箭的射手找到目标;理论能力为软件的开发提供相应的知识理论储备,为实现开发目标保障了理论可行性和技术可行性,好比为弓箭手造好弓、锻利箭;优秀的抽象能力为前后端开发保驾护航,提供强大的算法、数据处理、信号处理、信息交互、UI交互等,好比为好弓好箭找了好弓箭手。

**结论:**拈弓搭箭并非是一气呵成的事,要做一个好的开发者需要三种能力皆俱且精通。我认为设计能力比其他两种能力更为重要一些,只有如此,自身掌握的技术和知识才能”有的放矢“。

信息技术解决同一问题的途径和方法是否唯一

本文还是以上述汉诺塔的例子进行论述:在汉诺塔的算法推导中,核心思想便是**”递归“**,我便开始思考有没有算法能不使用递归思想将汉诺塔问题解答。在经过大量、反复、惨烈的尝试无果后,在网上搜索到一个非递归算法如下:

def hanoi(n):
    tower_belong = [0] * n
    if n % 2 == 0:
        tower_name = ['A', 'B', 'C']
    else:
        tower_name = ['A', 'C', 'B']
    for step in range(1, 2**n):
        bin_step = bin(step)
        gold_num = len(bin_step) - bin_step.rfind('1') - 1
        
        print(f"第 {step:2} 步:移动 {str(gold_num)} 号金片,从 {tower_name[tower_belong[gold_num]]} 塔到", end=' ')
        if gold_num % 2 == 0:
            tower_belong[gold_num] = (tower_belong[gold_num] + 1) % 3
        else:
            tower_belong[gold_num] = (tower_belong[gold_num] + 2) % 3
        print(tower_name[tower_belong[gold_num]], '塔')
n=input("汉诺塔有多高:")
n=int(n)
hanoi(n)

output:汉诺塔有多高:21 步:移动 0 号金片,从 A 塔到 B 塔
	   第  2 步:移动 1 号金片,从 A 塔到 C 塔
	   第  3 步:移动 0 号金片,从 B 塔到 C 塔

​ 在网上查找相关资料后,我发现对于汉诺塔问题,各路大神都有更多的算法甚至更深层次的理论、实践等。汉诺塔的算法是无穷尽的,同样,对于信息技术解决同一问题的途径和方法必然不可能是唯一的。霍金在《果壳中的宇宙》中提到:“如果我们已经抵达终点,则人类精神将枯萎死亡。但我认为,我们将永远不会停止:我们若不更加深邃,定将更加复杂。我们将永远处于可能性的膨胀的视界之中心。” 一个问题、一门学科往往都有着纷繁无穷尽的思考和理论,那是追寻真理之人所探寻的…

**结论:**信息技术解决同一问题的途径和方法无穷尽。

运用不同的工具求解问题,方法是否相同

**结论:**不同。

​ 通过一个工作室的考核,最终试让我做一个微信小程序。然后就开始了苦苦学习js、css和通宵肝代码之路。最终做出来一个模仿网易云的音乐微信小程序,由于无法连接云端数据,所以只有本地的几首音乐和一堆存在qq空间的图片(缩小程序本体的体积方便调试),效果不是特别理想。后来师兄师姐告诉我可以破解调用的API工具,用来连接官方的服务器,从而获取一切需要的样式、数据等。

​ 由我的惨痛经历可知,运用不同的工具求解问题,方法当然不同,但是在实际的开发中,效率为王!!!

既然有现成的方法可以直接使用,为什么还要掌握基本理论和原理

​ 据悉,在大厂的开发中,很多模块都是高级开发者封装好了的,对于码农而言,不理解也不需要理解所封装的程序是怎样的原理,只需要知道它是干什么的、公开的接口是什么即可。而对于程序员而言,理解知识的原理至关重要!!!要做写封装的人!!!!!!

你认为所有的知识都有必要深入学习吗?目前你感兴趣的方向是什么? 接下来主要的学习内容是什么?

我认为知识的学习并非浅尝辄止,对于不想深入的领域,理解简单的原理即可。目前感兴趣的方向是开发和数据类。接下来将会将开发和算法学习相结合地深入并且运用。接下来主要的学习内容是Java和KNN!道阻且长,使劲行则将至。

很多同学2-3年后会感觉什么都没有学到,或是实践能力较差,你认为该怎样去避免?

1.要跟师兄师姐的项目、要申请、竞争参与导师的项目,更要争取机会像师兄师姐一样自己带项目!!!

2.在掌握了技术之后多看github上优秀的开源的项目,努力搞懂其中的技术。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值