从绘画角度理解:编程思维之结构化编程

大家好,这篇文章主要面向没有学习过编程或者学习编程不久的人,用几个比较形象的例子来介绍有关编程思维方面的内容。

例子1:
如果你要计算:两个数的和,你需要的是两个数分别的值。比如:a=1, b=100。那么他们的和就是a+b。
如果用编程语句来表达就是:
function sum($a, $b){
return $a+$b;
}
这就是一个简单的函数,函数的作用是计算2个数的和。在你代码的任何地方,你都可以使用这个函数,来计算2个值的和。
调用的方法就是:sum($a, $b)。你需要的就是定义$a = 1; $b=100(计算机智能的地方就在于,你可以给他任何数值,它就可以返回给你他们的和)。然后函数就会自动返回这2个数的和。

上面的例子非常简单,可能你会觉得这个太简单了,我不用计算机也可以计算出来!但是假如是计算一个圆的面积呢?面积公式是(π*r*r),这个就可以提现计算机的作用了。你只需要传入一个圆的半径大小给一个求面积的函数,它就可以给你计算出这个圆的面积。

这个例子可能非常的简单,但是足以说明,计算机非常擅长计算,人们只需要给他一些数值,它就可以在极短的时间内返回计算的结果给你,哪怕你的计算过程很复杂,都是如此,而且不会出错。

例子2:
回到有关编程的话题。我们引入一个实际编程工作当中的一个案例。实现一个验证码,用于注册或者登陆功能,当用户输入正确的验证码以后,才可以成功的登录,目的是防止机器注册。

我们把验证码进行分解,实际上它就没有我们看上去那么的神奇,也是有规律的。
01.只有背景色的验证码;
02.加入了干扰字符的验证码;
03.加入了干扰线的验证码;
验证码的实现过程
这里简单的解释一下验证码的实现步骤:
第一步:准备好一张画布;
第二步:画背景色(你需要准备背景的颜色,而且每次的颜色可以不一样);
第三步:写上随机的英文字符或中文字符,数字等(你需要准备这些随机的字符,使用一个类似随机生成字符的函数即可)
第四步:你可以选择加入一些干扰的点,或者干扰的随机字符(你需要准备的是干扰的点的随机坐标,干扰的点的颜色、或者是字符)
第五步:你可以选择制造一些干扰的线(你需要准备干扰线的数量,每条干扰线的起始和终点坐标)

最后一步:生成一张验证码图片,并显示在浏览器上。

第一步的代码:
$image = imagecreatetruecolor($width, $height);
参数:画布宽度;高度
返回结果:画布资源

第二步的代码:
imagefill($image, $x, $y, $color);
参数:第一步创建的画布资源;填充的坐标X,坐标Y,颜色;
操作:给画布填充了背景色

第三步:在画布上写上随机字符
imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
参数说明:
$image:画布
$size:字体大小
$angle:字符旋转的角度
$x:字符坐标X
$y:字符坐标Y
$color:画笔颜色
$fontfile:字符的字体
$text:字符(使用另外的函数随机生成1个字符)

一般如果你需要生成4个字符的验证码,就是上面的步骤循环4步,每次的X坐标往右移动1个字符距离。Y坐标保持不变。每次的角度可以随机生成,看看每个字符是不是角度不一样了。每次画笔的颜色也可以不同,是不是每个字符的颜色不一样了。所以生成的字符效果就如同下图所示:

verfiy3

第四步:画点,随机取坐标
imagesetpixel($image, $x, $y, $color)
参数说明:
$image: 画布
$x:点的坐标X
$y: 点的坐标y
$color: 点的颜色

第五步:画干扰线
imageline($image, $x1, $y1, $x2, $y2, $color)
参数说明:
$image: 画布
$x1, $y1: 线的起点坐标X,Y
$x2, $y2: 线的终点坐标X,Y
$color: 线的颜色
效果如图:

随机线条


最后一步:
imagejpeg($image);
生成图像

通过验证码的生成的讲解,总结如下:
1、每一个步骤,都由一个函数执行,按照一定的步骤的发送给计算机一些执行指令。就好像绘画里面,我们得先画轮廓,再依次画人物的五官(眼睛,鼻子,耳朵,嘴巴……),再描绘一些细节,最后上色。绘画的过程
2、每一个函数的执行,都需要提供一些参数。就好像你要求2个数的总和,首先你得提供两个数。程序员所需要做的就是在每一个步骤,使用正确的函数,并且传递正确的参数。比如我需要画一条线,那么你就找到画线的方法(程序里面叫函数)imageline(),然后提供正确的参数:参数一般都是数值或者字符串。比如画线你需要准备:线的2端的坐标。就如:imageline($image, $x1, $y1, $x2, $y2, $color)。$color代表颜色。如果你需要画30条线,那么就重复执行这个画线的步骤(在计算机里,这叫做循环,计算机最擅长的事情就是判断真假、和循环执行)。
3、每一个步骤所使用的函数,都是编程语言已经提供好的方法。就如同计算2个数值的和一样,为我们准备好了!像这样的函数,PHP编程语言为我们准备了数千个!常用的有200多个,你想开发一般的网站都可以够用了!

那么有人问了,是否我们每次要实现验证码都需要这么复杂呢?当然不是,程序员其实也是很懒的,既然我们已经知道怎么实现验证码了,那么我们就可以把这个验证码的代码,封装起来形成1个更大的函数。那么我们要实现验证码的时候,就像求2个数的和一样简单了,方法实际上是一样的。

比如实现的代码语法就是:function_name();
(语法说明:function_name就是我们给生成验证码这个功能取得一个名字,()括号里面就是填入参数的地方,不同的参数之间要使用’,’分隔开)

实现方式如下:
生成验证码(‘4个字符’,’颜色随机’,’背景色随机’,’有干扰线条’);
当你在程序当中调用这个方法,提供一些参数,它就可以生成一个验证码。

所以你发现:实现验证码是一个由更多的系统函数,按照一定的逻辑过程组合在了一起,来生成了一个更复杂的功能的过程

我们可以想象一下,程序员的工作就是按照一定的业务逻辑,正确的使用函数的方式(提供这个函数需要的各个参数。),或者把一些函数封装成一个功能更大的函数,而这些函数是可以重复使用提升效率(等同于你不需要每次从0开始,你甚至可以借用,前人已经开发好的函数,或者自己之前写好的函数)来一步步的达到自己想要实现的功能(就好像绘画的过程,先画轮廓,再画五官,最后描绘细节)。

以上,就是有关编程思维的一些解释。限于时间和经验有限,可能描述的还不是非常便于理解,在计算机的专业术语上,函数的这种调用过程有一个专业的名字解释,叫做结构化编程

最后我想说的就是,正确的编程思维,会帮助你更好的理解程序代码,有助于写出更加清晰的代码,和理解别人写的代码,从而学会编程。反之,就如同绘画不是从轮廓、五官、细节,而是至上而下,最终可能画出一副很奇怪的画,毕竟我们不是打印机可以自上而下的完成绘制过程。

打印机打印过程

编程是一个什么鬼,新手学习编程的心得(末尾有彩蛋)

这篇文章是讲述一下我对编程目前的理解,也是作为一个新手刚学习编程不久的一些不太成熟的想法。(备注:如果您没有学习编程语言的经历,理解起来可能有一些不适应!)

编程语言拿到一门编程语言,首先要从概念上去理解这一门编程语言是属于什么类型。

比 如是编译型还是解释型。像解释型的就一般使用文本代码编辑器,就可以开始编程了,因为编写出来的都是文本文件,放在服务器运行环境,解释器可以解析成计算 机可以理解的二进制代码,用户调用时才返回或者输出结果。至于编译型,我们可以这么理解,就是更加接近计算机而不是人可以理解的接近底层的代码了。

所 以像大部分比较容易掌握和使用的代码就都是解释型编程语言,比如PHP, PYTHON。那么为什么还有编译型语言呢?像C++,Java,因为他们不需要解释器解释就可以编译成二进制的机器代码执行,所以效率要高。比如开发游 戏,工具,对机器的执行效率要求往往很高,就都使用编译型语言啊!

我目前所学习的就是比较容易掌握的解释型编程语言:PHP。

一 般的学习过程就是:基本语法(变量及变量的定义,常量的定义),基本数据类型(整型、浮点数、布尔值、字符串),流程控制语句(假设判断,循环判断,特殊 控制语句),函数(函数的定义与调用,常用的系统函数,系统函数的参数类型,一些函数的特性:匿名函数、回调函数、闭包),复杂的数据类型(数组:可以存 储多个值得数据类型),对象(一种更加牛逼的数据类型,包含了更多函数,变量,常量)。接着就是一些常见的字符串处理函数(包括正则表达式),文件系统处 理,图像系统函数(可生成一些简单的图像,如验证码)。

总结编程就是:数据类型 + 流程控制 + 系统函数。

数据类型和流程控制一般比较容易掌握,熟悉基本的语法后,加以一定的实例代码的简单练习即可!

系统函数的熟悉需要一段比较长的过程,现在的方法是:先背诵一遍,再默写,基本知道有哪些常见的系统函数,然后通过写字符串函数处理、验证码输出、文件系统管理,就可以大致的熟练一些常用的系统函数的使用,然后可以灵活的使用这些系统函数。

最近做的最多的还是多熟悉几遍这些系统函数的简单应用吧! 培养使用编程开发的思维,以及熟悉这些系统函数。后续再去熟悉更多的系统函数也就不会有一种恐惧感。其实可能没有那么恐怖,无非就是一些系统函数的使用。 即使很复杂的系统函数的调用,也不过是参数个数比较多,而参数一般往往无非就那么常见的几种:随机数、变量、数组、一些函数作为参数等等;技术上是很好理解的。

现在,还没有开始学习,面向对象的编程思维,从面向过程的思维转变到面向对象的一些心得,就等下回分享吧!

广州
2016-5-22

520

让学习成为一种习惯

来到这里学习到今天为止整整1个月的时间。对于一个已经工作多年,重新对于学习有了新的认识。这种认识并不是说是新的知识,而是更加深刻的意识到时间管理、学习笔记的重要性,正好像我们的口号一样“让学习成为一种习惯”。

其实,我们一直在学习,只是有时候学习效率很低,渐渐地你会消极,会没有信心,也没有乐趣。今天我数数自己的笔记,7天记录了35张共70页的工整的笔记,有些令我吃惊。对于一件看起来很难的事情,有时候需要给自己一些潜意识的鼓励,让也许有些枯燥的事情变的比较快乐!我想我会坚持这个习惯,隔段时间数数这个月写了多少页,读了哪些书,想想会觉得时间过得比较充实。而不是回忆、总结的时候,发现自己虚度了不少的时光。

不同的领域,可能需要的学习方法并不一样,对于计算机来说,新学习一门知识,是需要掌握不少新的概念,反复的练习来巩固的,这里就不深入了。

另外,我准备了一个日记本,简单的记录每天做的事情,现在看来觉得挺有用,发不了几分钟的时间,当我需要回顾的时候,发觉就很有必要!如果没有这样的记录,你都很难想起,上一周,甚至前几天,你做过了什么?

此外,我渐渐的会有一定的时间管理观念。比如学习的整个周期是5个月,现在已经过去了1/5,离我去选择目标公司还剩下的时间已经过去了20%,我会开始紧张,时间过得真的很快。我必须在我的日记里,周末的时候抽时间写下我下周要做的安排。通过1个月的学习,在你的知识清单上,你又入门了一门学科,当你读类似的扩展的书籍的时候,发现没有那么费力了,可以看懂了!

像这段要求一样,在一个招聘需求中整理的内容:

一、技能需求:APP接口开发,PHP框架(如:thinkphp,YII,CI等),mysql\nosql数据库(数据库优化、数据库设计能 力),memcached\redis等大并发下的缓存技术,Ajax\JSON\Jquery\Smarty\Javascript\CSS3等,大型 互联网产品的架构设计经验,

二、其他:拥有良好的代码习惯,要求结构清晰,命名规范,逻辑性强,复用率高,代码冗余率低。逻辑思维能力强,责任心强,工作积极主动,具备强烈的进取心和良好的团队合作精神,有较强的沟通及协调能力,有独立解决问题能力。

三、相关:APP网站

在制定后期计划的时候,就需要用得着了,有一些内容在培训的时候并不会涉及到,或者涉及的不会很深入,只是一些皮毛!如何短期内去掌握一些扩展的知识,填补这些知识点不仅仅利于提升自己全方位的竞争力,对于知识的补缺,你会感觉到时间的利用需要更加有效率,可以反推让自己更加有效的利用时间,提高时间的利用效率。

之前,也阅读过一些类似时间管理的书籍,但是落到实处的很少,大多就是读起来很有感觉,但是做起来已经忘光光了。也许“让学习成为一种习惯”,才能真正的掌握好时间的利用吧!

另外,IT行业普遍的工作时间算是比较长的,因此时间观念和学习方法会更加重要!据某某分析,成年男性每天的睡眠时间,7-8小时最佳,多了或者少了,都不是最好的。以此我安排好了自己的时间。早上8:00起床,中午午休1小时,晚饭后午休30分钟左右,晚上凌晨1:30 – 2:00开始睡觉,实行一段时间看看,每晚可以看看凌晨广州的夜空,祝愿这会是一段美好的时光。

2016年5月15日 广州

学习笔记

谁还不跨个界,你赖以生存的技能是什么?

淘宝也就成立了2个5年多,那会我还在上学!也不知道将来会从事什么样的职业。今天突然回首走过的这几年自己到底会做什么?如果用2个词形容就是:产品、营销。

产品:那时候用过的产品,手机、电脑,无论从功能、配置上,和现在无法比。那个时候购买的场景基本上是去电脑城、步行街、批发市场,那个时候每次买的大件支付的是现金,很流行发广告单。

营销:那时候的宣传基本是电视广告、传单,对产品的了解程度也不那么深。也很少有什么信息渠道来源,即使有也不是那么容易分辨。

几年前做电商很火,品牌店也活的不错!现如今:营销出现了自媒体、IP,对于产品的品质要求也越来越高。人们的消费方式在随之发生很多的变化,教育、旅游。

总结我以前的职业:网络营销、推广。它们的价值是什么?简单一点说,就是装修网页(从内容,视觉等方面)、在网络上获取目标客户的流量,从而达成交易,获取回报!你赖以生存的技能是:比其他人更擅长于通过网络营销带来客户。BUT,同样是网络营销,以前是搜索优化,现如今公众号、自媒体、自视频层出不穷。

时代在变化,我相信每一个人包括我们自己,对于事情的看法,购买的习惯,欣赏的水平都在提升,所以几年前的办法已经不那么奏效了。除此以外的是资源的短缺,一个相对而言一样大小大饼,分的人开始变得越来越多了,这算是次要原因。根本的原因是用户对于产品和服务本身的需求,开始逐渐的发生了变化。

这一切都在几年发生了提升,而大部分处于职场中的人们除了忙碌的工作,似乎早已忘记了很多其他方面的能力,在重复的工作内容中消磨着日子的感觉。即使小部分能力强的人,好不容易达到了上层水平或者该领域有了一定的成绩。但即便如此,还是发觉自己已经掌握的东西在逐渐的被新的东西所“淘汰”。

现在如今的产品和营销都在悄然的发生着变形和升级,留给我们的是更多的思考与提升,2016跨界年,你赖以生存的技能是什么呢?5年太远但也太快,不敢想象,但是也得做好准备。

由新手学习编程的困惑,引出学好编程,掌握基础知识的重要性

以前自学过编程有一段时间,比如我学习过python基础那本书,还跟着书本上的例子敲过一些python代码,但是后面却从来没有使用python做过任何的程序,学完就放下了。然后就怀疑自己,到底会python吗?可是为什么我却不能使用它做一些小程序呢?当然原因有一些,这篇文章主要是介绍基础知识是否重要,不然就像我一样,可能中途学习然后打退堂鼓,似懂非懂走了很多弯路。

想想,我的这种学习方法肯定是有问题的。每一门编程的语法基础一定是很重要的,就像下面这张图一样。

基础知识的重要性

“高级课程”其实是有误导的一个名称。为什么这么说?因为所谓的高级课程其实是指的“应用”。意思就是使用编程的基础知识:语法、流程控制如循环、条件判断、函数应用、系统函数的调用、结果的输出等…这些基础知识来开发一些应用。我的理解就是高级课程知识用前面学习的基础知识来实现一些功能应用的部分。最重要的反而是前面的基础知识,而且基础知识掌握的好,才能实现后面的应用。

当然应用的种类千变万化,需求各式各样,然而都是由基础知识扩展衍生出来的提升开发软件的一些东西(就不在这里展开讨论了,总之高级课程是基于基础知识而来)。基础知识能够掌握的好,到后期高级课程应该是更加轻松的才对,不仅仅会发觉原来编程可以这么好玩!可惜,大部分人一上来就接触到高级课程的那种酷炫效果,主观的感受基础课程是”基础”,没有”高级”那么重要!这是一个新手学习编程之初最大的误导。

谢谢大家!万丈高楼平地起!希望各位想能够学好编程的人,可以重视基础知识,掌握好他们,才能更加顺利的学习,尽管有时会有比较“枯燥无趣”的错觉。关于如何学习的一些方法和心得在后面将会写一篇文章分享和大家交流、学习!大家可以关注我的微信号,随时关注我的最新动态!

webjust的微信(求关注:不关注这个微信号的程序员,不是一个好程序猿)

遍历文件名称遇到目录名为0的情况,写判断条件使用!==

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
    var_dump("false"==0);
    //返回 boolean true

    var_dump(false=="0");
    //返回 boolean true

    var_dump(false!=="0");
    //返回 boolean true

    var_dump(false!="0");
    //返回 boolean false

    /*
        当读取文件名称时,while (false !== ($file = readdir($handle))) 条件为true时,输出文件名称。

        如果遇到文件夹名称为“0”时,只有var_dump(false!=="0")才可以完整的遍历当前目录下得所有文件
    */

    /*程序应用如下*/

    if ($handle = opendir('./mycncart')) {        //遍历目标文件目录
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                echo "$file<br />";
            }
        }
        closedir($handle);
    }

?>