聪少爱学堂 专注分享全网引流精准引流方法及自媒体运营干货
程序员Dan Uyemura有十几年的开发经验,最近他开发了一个健身馆管理和计费系统,这个软件给他带来了每月70万(10万美元)的收入。这比他当程序员时的收入高多了。
现在很多企业会提供无限量的汽水、零食,甚至免费晚餐,Dan Uyemura在这样的企业里待过几年之后,体重增长了27斤。他找了个健身馆想要减肥,但看到健身馆的管理软件后,就开始偏离“想运动”的初衷了。他发现健身馆的软件特别差劲,并且经过一番调查之后发现这个行业软件几乎没有创新,技术过时,系统极为笨重。
Dan立即找了几位对健身同样感兴趣的程序员,组了一支队伍。几个人利用业余时间开发出了这款软件,有了收入之后他们还分享了一些开发时的经验和心得。
这支小队伍几个人一起设计了外观、制作了原型,编写了第一个产品。项目早期的时候,因为几位程序员都在30岁以上,有家庭有孩子,这事儿就显得有些艰难。他们经常下班后工作2到4个小时,有时甚至工作到转点儿,也有多次通宵的经历,这导致有两位中间退出了该项目。
这款名为PushPress的软件,从健身馆的第一视觉进行了设计,最开始选择为真实客户解决实际问题,之后他们开始做了一些营销的工作。他们制作了一些海报,以免费资源的方式分发给各个健身馆。海报发布后,平均每月流量增加了两倍。
还给社区设计了免费的好看且易于操作的健身计时器。计时器发布之后,流量又增加了一倍。
发展到现在,这款软件带来了每个月10万美元的收入。
Hacker News上还有很多类似的故事。比如Starterstory的创始人,也是一位全职开发者。最开始因为对创业故事感兴趣,于是做了一个网站帮助大家创业。这个网站目前每月收入为1700美元。
Patrick Hess是一位工业部业务发展主管,喜欢玩类似台球之类的游戏,于是他开发了一款Bar Games 101的网站。现在该网站每月收入3500美元。
很多人都说程序员吃年轻饭的,到了一定年龄要面临被裁的风险,普通开发者常常处于焦虑之中。很多人希望给自己留条后路,比如做做副业。在中国的自媒体环境下,不少技术人开设了自己的公众号。这些公众号最初也能吸引一批志同道合的技术爱好者,但到了需要变现时就开始发广告,逃脱不了“我想跟你谈技术,你却借机想割我韭菜”的境地。可以说是做了花了时间砸自己招牌的事情。
如果想做副业,可以选择正确的副业,比如复用自己的技术特长,以“解决实际问题“为出发点,开发一个真正对世界有用的产品。
在学习Haskell之前,作者一直使用主流语言,如Java、C和C++——现在他仍然喜欢它们。那么,一个命令式开发人员如何转变成了一个Haskell开发者?他将在本文中将对此做出解释——尤其是对那些在函数式编程方面经验较少的开发人员。
本文最初发布于Mario Morgenthum的个人博客,由InfoQ中文站翻译并分享。
首先,我将通过对一些主题的讨论比较函数式编程和面向对象编程,因为它是最流行的范式。在第一个代码示例中,我将简要介绍Haskell的语法,因为我将在本文中使用它。
控制流描述你如何告诉程序做什么——形成算法。基本控制元素有以下三种:
顺序——顺序执行代码
重复——重复执行代码
选择——根据条件将代码划分成分支
顺序是语句逐行执行
重复是循环,如for或while语句,或递归
选择是if … else或switch语句
下面这个简单的例子使用Java实现文本居中显示。该文本是作为一个字符串数组传入的。每一行是这个数组的一个元素:
void alignCenter(String[] text)
{
int maxLength=0;
for (String line : text) {
if (line.length() > maxLength) {
maxLength=line.length();
}
}
for (int i=0; i < text.length; ++i)
{
int spaceCount=(maxLength - text[i].length()) / 2;
StringBuilder builder=new StringBuilder();
for (int j=0; j < spaceCount; ++j)
{
builder.append(' ');
}
builder.append(text[i]);
text[i]=builder.toString();
}
} 顺序是链式调用
重复是递归
选择是模式匹配,或case … of或if … else表达式
下面是同一个例子的Haskell实现,展示模式匹配和递归的用法:
alignCenter :: [String] -> [String]
alignCenter xs=alignCenter' maxLength xs
where maxLength=maximum (map length xs)
alignCenter' :: Int -> [String] -> [String]
alignCenter' _ []=[]
alignCenter' n (x:xs)=(replicate spaceCount ' ' ++ x) : alignCenter' n xs
where spaceCount=div (n - length x) 2
下面是一个没有使用递归的简化版本,使用了map和lambda函数:
alignCenter :: [String] -> [String]
alignCenter xs=map (\x -> replicate (div (n - length x) 2) ' ' ++ x) xs
where n=maximum (map length xs)
函数的第一行是签名。签名alignCenter :: [String] -> [String]告诉我们这是一个名为alignCenter的函数,其输入是一个字符串列表,输出是一个新字符串列表(从左往右读)。
第一个函数确定字符串列表中最长的行,并调用第二个函数。我们通过一个简单的表达式maximum (map length xs)终止第一个循环。那么它是如何工作的?让我们看下涉及到的所有函数的签名。
length :: [a] -> Int
map :: (a -> b) -> [a] -> [b]
maximum :: [a] -> a
length函数的输入是一个任意类型的列表,输出是一个Int值。类型签名中的所有小写类型都是类型变量,类似于Java中List里的T。我认为函数的功能非常明了。
map函数接收两个参数,第一个是a -> b类型的函数,第二个是[a],返回值是[b]。 那么,“它接收一个函数作为参数”是什么意思呢?是的,这是真的。你可以将函数作为参数传递,不过不能是函数指针(如C语言中),也不能是方法引用(如Java语言中),要是作为第一类值的真正函数。以函数为参数或返回新函数作为结果的函数称为高阶函数。那么,这个函数是干什么用的呢?它将[a]的每个元素传递给a -> b函数,后者将a转换为b,并把它们汇集到一个新列表[b]中。
现在让我们解析下类型变量map length xs,其中,xs是[String]类型。
map :: (String -> Int) -> [String] -> [Int]
你需要知道String是[Char]类型的同义词,表示字符列表。这就是为什么它兼容length函数。表达式map length [“Hello”, “World!”]会被解析成[5, 6]。我们感兴趣的是列表中最长字符串的长度,因此,我们将结果列表传给maximum,它会返回列表中长度最大的元素,即6。
我们看下第二个函数:
alignCenter' :: Int -> [String] -> [String]
你可能已经注意到函数名末尾的’。没有什么特别的,它只是Haskell中一个有效的标识符字符,因为它在数学中是一个常用符号,表示与先前标识符相关的名称。该函数是递归的,我们遍历文本的每一行,进行转换,并将转换后的行放在所有剩余元素的递归调用之前。
alignCenter’ _[]=[]这行代码是递归基本型。它的意思是:如果第二个参数是空列表,那么返回一个空列表,因为没有什么可做。在这种情况下,我们对第一个参数的值不感兴趣,所以我们不需要为它命名而只需要以_表示。
以下几行代码就完成了整个工作:
alignCenter' n (x:xs)=(replicate spaceCount ' ' ++ x) : alignCenter' n xs
where spaceCount=div (n - length x) 2
我们将第一个参数绑定到n,将第二个参数(一个列表)与模式(x:xs)进行匹配,这意味着:将列表的第一个元素绑定到x,其余所有元素绑定到xs。我们会根据需要复制空格,将它们与当前元素x串在一起,并在所有剩余的元素xs递归调用的结果列表前加上:。就这些。
在递归操作(reduction step)之前声明递归的结束条件(base case)非常重要,因为编译器自顶向下运行,并采用它找到的第一个匹配模式。
与相同代码的OOP版本相比,我们使用模式匹配和抽象函数节省了大量代码。好了,现在你可能会抱怨:“嗯,你只是把整个代码隐藏在库函数里了,比如replicate、map和maximum”——我告诉你:“是的,当然!因为我不需要成千上万次地重复编写同样的for循环!”老实说,Java代码可以使用leftPad之类的东西来复制空格,但它是一个非常具体的函数,专门用于填充字符串,没有其他用途。
在函数式编程中,你能够以一种简单的方式抽象常见的循环用例来执行映射、过滤、折叠和展开等任务。在OOP中,如果没有大量的样板代码(如后台接口和内置语法糖),你将无法实现这样优雅的解决方案。
这些概念描述了构建应用程序的基本思想。代码、数据及其交互在各自的范式中是如何表示的?
面向对象编程引入了接口、类、继承和对象的概念。对象包含数据字段和方法代码,这些方法通过操作字段来更改对象状态。
函数式编程的核心是函数。与OOP中的方法相比,你能用它做的事情更多:
把函数传递给其他函数
将新函数作为函数的求值结果返回
将两个函数组合成一个新函数
使用函数的一部分构建一个新函数
函数求值的输出只取决于它的输入。这意味着不存在可以影响函数结果的隐藏变量。这大大提高了可测试性。
数据由代数数据类型表示。在函数式编程中,你不需要像类那样将数据和代码放在容器中。你将构建一组数据类型和一组单独的函数,这些函数对这些类型进行操作。数据类型不知道它们被哪些函数使用,因为它们对函数一无所知,而且每个函数都不知道还有其他函数也对相同的数据类型进行操作。
下面是Haskell中数据类型的一些例子,只是让你感受下它们是如何定义的:
data Bool=True | False
data Customer=Customer Int String
data Customer'=Customer' {
customerId :: Int,
customerName :: String
}
总是有一个数据类型名称和一个以|分隔的构造函数名称列表,其中包含可选参数。第一个示例很简单。第二个示例有一个与类型同名的构造函数和两个参数。最后一个示例与前面的示例相同,但是使用了命名参数,这称为记录语法。
Haskell中的数据是不可变的,这意味着你不能更改Customer的姓名,而是需要用新姓名创建一个客户。
假设,你有一个现实世界的问题需要解决。第一步做什么?试着把问题分解成更小的问题,然后再进一步细分下去。然后,描述你的问题,这意味着将你的问题放入你选择的编程语言的俚语中。
在OOP的情况下,你需要发现类及其字段和方法,找到相似性,将它们放入抽象类中,并最终通过派生这些抽象类来构建可以供使用的具体类。
FP则是从函数开始。一个函数处理一个非常小的问题,它操作非常小的类型。在理想情况下,类型完全包含函数所需的信息,不多不少。这可以保证类型和函数几乎不需要更改,即使你完全重构了应用程序的其余部分,除非你的问题发生了变化。事实证明,你还会将你的逻辑类型或业务实体分解为小的技术类型,从而实现无痛且安全的重构。
耦合描述组件之间依赖关系以及一个组件的变化对其他组件的影响。
彼此通信的对象是紧耦合的。限制耦合的一种方法是应用诸如依赖倒置之类的原则,即你应该通过抽象(如接口)而不是实现(如类)进行通信。
为我们希望其交换信息的实现定义接口。为了避免出现很大的通用接口,一个接口应该只包含几个高内聚方法——这称为接口隔离。从长远来看,如果做得不对,你很可能会遇到虚拟接口实现,比如抛出UnsupportedOperationException异常或在空方法体中返回虚拟值。
当涉及到接口实现时,你经常添加抽象类来实现接口的某些部分,未受影响的接口方法仍由具体实现来实现——这就是继承的原理,这是OOP中最紧密的耦合。
面向对象和继承的思想是为了使编程更接近现实世界。我们都知道这样的例子:“对于Car和Truck这两个派生类,有两个基类Vehicle和Ship。可是,Amphibian怎么处理?”它有两个基类的特征——所以你需要多重继承,但因为钻石问题,这是一个坏主意。为了解决这些问题,开发人员引入了组合优于继承的原则,这意味着你应该用可替换的组件组合对象。显然,组合优于继承有点违背OOP的原始关键概念之一——继承。
如你所见,一切都关乎正确的类和接口结构——为了设计出一个好的软件设计,还有很多原则、反原则和模式需要你关注。
最后但同样重要的是,下面这个简单的例子展示了如何使用依赖倒置原则实现排序算法与比较逻辑的松耦合,该例子使用接口作为抽象:
interface Comparator
{
int compare(T o1, T o2);
}
class ArcaneComparator
{
public int compare(T o1, T o2)
{
// 在这里插入晦涩难懂的比较实现
}
}
class Arrays
{
static
{
// 使用比较器c,
// 不需要了解具体实现
}
}
FP是组合组件而不是耦合组件。FP中的松耦合函数是指通过识别相似性来抽象函数,提取细节,构建高阶函数,并用细节参数化它们。
让我们来看看下面的情况:
sortById :: [Customer] -> [Customer]
sortByName :: [Customer] -> [Customer]
有两个函数做同样的事情——它们按照某些标准进行排序。那么,为什么我们不把相似点放到一个新的函数中来防止重复呢?
data Ordering=LT | EQ | GT
...
sort :: (Customer -> Customer -> Ordering) -> [Customer] -> [Customer]
compareId :: Customer -> Customer -> Ordering
compareName :: Customer -> Customer -> Ordering
或使用一个类型同义词:
type Compare=Customer -> Customer -> Ordering
sort :: Compare -> [Customer] -> [Customer]
compareId :: Compare
compareName :: Compare
sort 的第一个参数是Customer -> Customer -> ordering类型的函数,这意味着它接收两个客户,对于小于、等于或大于的情况,分别返回LT、EQ或GT。这有什么不同呢?我们分解出了上述用于对列表进行排序的标准。我们现在可以写成sort compareId而不是sortById。如果你还想叫它sortById,也很容易做到:
sortById :: [Customer] -> [Customer]
sortById customers=sort compareId customers
或者:
sortById :: [Customer] -> [Customer]
sortById=sort compareId
如果你是最近才接触函数式编程,那么第二个版本在你看来可能有点不够清晰,所以我建议你好好看看第一个版本。如果你对第二种方法感兴趣,你可以进一步阅读,这称为Eta变换。
sort函数仍然依赖于Customer 类型,这已经不重要了,因为这些细节被分解了。只有compare函数对类型的细节感兴趣。所以我们可以用一个类型变量替换它:
sort :: (a -> a -> Ordering) -> [a] -> [a]
我们可以用任何一种方式表达相同的功能。在OOP中,我们使用了一些语言特性,比如接口以及实现该接口的类。在FP中,我们有函数。类型a -> a ->Ordering表示接口,与该类型匹配的每个函数都可能是该接口的实现。
Monads——因为我不想陷入monad谬误
类型类——没有理由
Haskell 是有类型lambda 演算的实现。Haskell中的所有东西都有数学支持,比如范畴和类型理论。
Haskell是强静态类型,但你很少需要自己编写类型,因为编译器在大多数情况下可以从全局推断它的类型。
因为抽象性和不可变性,Haskell 的速度比你想的要快。
在我个人看来,我觉得函数式编程比面向对象编程干净得多。
在编写相同的功能时,你可以:
更抽象
编写更少代码
使用更少的样板特性
而且:
更可维护
更稳定
更有趣
非常感性您耐心地读完这篇文章!
原文链接:
https://morgenthum.dev/articles/why-prefer-fp
2019年,在大部分人刚刚搞懂人工智能是怎么回事儿的时候,一个新概念又冒了出来。按说科技圈子偶尔出现一两个新概念并不是什么新鲜事儿,但是这个词语的出现让科技圈、创投圈都陷入了一段狂热之中。
RPA,机器人流程自动化(Robotic process automation),号称可以简化工作流程,极大程度提升工作效率,虽然这项技术被一些业内人士认为“与AI根本无关”,但同时RPA+AI似乎是一个可行的方向,因为它解决了AI目前最大的落地难问题。
有人说RPA是人工智能发展过程中的缓冲剂,有人说RPA是创投圈子创造出来的“伪概念”,先别管这些说法是对是错、是真是假,你首先应该了解的是:RPA究竟是什么?
单从概念上说:机器人流程自动化(Robotic process automation),指的是依托机器人流程自动化技术的电脑程序,代替人类用来自动执行任务,以达到快速降低成本、提升表现的目的。
最适合采用这类技术的是涉及大量重复性手工处理、有固定规则、结构化数据较多的机构,比如金融财务服务行业。
举个例子:
以最常见的RPA财务分析机器人为例,处理财务分析报表时,机器人会打开指定的企业财务数据页面,一键提取页面中相应的数据信息,并自动汇总在表格软件当中。一些功能较多的RPA软件甚至可以将汇总好的表格数据自动生成柱状图、饼图等,并直接按照要求置入PPT文件里,大部分需要人工几小时甚至十几小时完成的任务,RPA软件可以在几分钟之内搞定,极大程度上缩短业务流程。
当然,这只是财务分析业务这一种RPA机器人的案例,在其他领域还有更多不同的RPA软件能够提供相应的服务。
如果只看上面的案例,可能会有读者认为RPA与AI并无差别,但实际上,RPA从技术层面来说并不能等同于人工智能,只是在很多环节上会用到人工智能的技术。
仍然以上面的RPA财务机器人举例:
当机器人打开需要分析的企业财务页面时,就会用到人工智能中的NLP(自然语言处理)技术,识别页面中企业名称、财务数据等相关字段,从而更加精准的整理成表格文件。
一句话总结就是:RPA能够替代人工,将繁琐的业务操作流程自动化,并更加精准地完成工作。
对于很多人来说,这是一个很受关注的问题。首先正面回答:有,RPA有核心技术。
RPA要实现的最核心的功能是通过模拟人类手工在电脑的操作,包括键盘、鼠标的输入等等,以达到节省人工操作、提升效率的目的,所以模拟技术可以说是RPA的核心之一。
多数主流RPA产品采用的技术主要有以下几种:
利用WIN32 API基于屏幕坐标点进行鼠标的移动点击拖放以及键盘操作;
利用WIN32 API获取句柄从而在鼠标光标不动情况下直接操作windows OS上运行的任意窗体及其内的控件;
利用IE DOM类库在鼠标光标不动情况下直接操作IE浏览器所打开的网页中的HTML元素;
利用图像识别和OCR技术基于屏幕区域截图比对来获取屏幕坐标位置并用WIN32 API触发鼠标键盘操作。
达观数据创始人兼CEO陈运文告诉记者:随着智能化发展,文本自动化处理系统、自然语言处理技术等等都可以被RPA厂商利用起来,如Transformer Learning、BERT等等在自然语言处理技术里最流行、最优秀的算法模型都可以融合在RPA当中。
此外,通过嵌入机器学习引擎来自适应被操作对象也逐渐成为RPA发展的趋势,比如同样的按钮改了部分文字、移动了位置等等,智能化的升级可以让RPA维护人员不必再疲于奔命的不断调试应付。
目前有一种流行的说法:RPA不过是AI难以落地的情况下用来缓冲的替代品。对于这个观点,陈运文表示:
你看到这些RPA机器人在模拟人的键盘和鼠标的操作,它在点击我们的客户端、点击网页、填信息、下载文档、审阅文档、发送邮件,这些都是你看到RPA做的工作,但是为什么RPA会做这些工作?它的背后是谁在控制它?其实是AI模块在控制。因为AI模块是学习了人类人工的操作过程,总结提炼人类阅读文档中的判断和人的行业知识,所以是AI系统在控制RPA流程操作的工作。大家看到的是RPA,但背后其实是我们的AI模块在控制它、操纵它。
简单来说:以达观数据为例,RPA可以算是其自身业务的自然延伸,内核仍然是AI。在前一篇文章中,相关专家已经提出过类似观点:AI技术的推进间接带动了RPA在更多场景下落地。所以,如果说RPA之前的核心技术是模拟操作,那么现在它的核心技术就是人工智能了。
要回答这个问题很简单:当然不是。记者也为此专门采访了来自达观数据的副总裁金克,他的看法是这样的:
首先,RPA最近一两年蓬勃发展的一个很重要原因,是人工智能的技术在近几年取得了很好的突破。从AlphaGo下围棋开始,深度神经网络、人工智能、文本处理、图像处理、语音处理,这些人工智能的技术这几年确实得到了非常蓬勃发展。
AI技术的推进间接带动了RPA在更多场景下落地,其实早在十几年以前就有脚本自动化,但为什么RPA现在突然在美国热起来了?因为大家发现有AI技术助力以后,脚本机器人不是只能做那些最简单的工作,它现在可以开始处理复杂的业务流程工作了,这是RPA在最近一两年蓬勃发展的最主要原因。
从另外一个角度来说,全球数字化经济发展到今天这个阶段,越来越多企业认可用数字化劳动力、数字化机器人代替人去工作这件事情,观念的改变以及企业信息化程度的提高,也给RPA的发展带来丰厚的土壤。如果企业都在用纸质办公,审批还要打印出来自己签名的话,那RPA还是用不起来的。现在很多企业的审批流程全部都是点一下按钮、在网上写评论意见就能够完成流程的,企业的数字化升级改造在之前已经逐步完成之后,也给RPA带来非常好的土壤,让它得到大规模使用。
总的来说,就是RPA与AI是相辅相成的,虽然RPA软件已经发展了多年,并且在早些年已经有了较为成熟的产品,但是AI的飞速发展让RPA有了更多的应用,这是企业可以实实在在用到的技术,自然也就跟“忽悠”没什么关系了。
RPA的出现引发了投资领域的关注,Gartner表示:RPA是当今企业技术领域最热门的领域之一,相关市场在今年(2019年)已达到13亿美元规模。
根据市场研究公司的数据,RPA软件收入在2018年增长了63.1%,达到8.46亿美元,使其成为全球企业软件市场中增长最快的部分,排名前五的RPA供应商(UiPath,Automation Anywhere,Blue Prism,NICE ,Pegasystems)控制着47%的市场。
与此同时,北美继续占据RPA软件市场的主导地位,2018年的市场份额为51%,其次是西欧,日本排名第三,2018年的采用率增长了124%。
从这些数据上来看,RPA的未来似乎大有潜力,但是陈运文认为:中国RPA从2019年开始才是一个起点,“春江水暖鸭先知”,投资是最先掌握技术发展方向的。RPA企业成长起来以后,会有具体的应用落地,更多行业会使用到RPA,先是创业投资企业培育成长,明年会有更多行业应用爆发出来。
此外,他表示:相比AI,不管是创投行业还是产业应用行业,现在大众已经变得更加理性和冷静,经过AI前几年的泡沫炒作,RPA这个行业会更理性、更客观,更关注它给产业带来的实际价值,所以发展也会更加冷静一些。
除了上面几个“重点问题”,有关RPA的争论还有很多,AI前线也就一些关键问题向陈运文、金克两位采访嘉宾进行了咨询,并整理如下,供读者参考:
RPA的发展历史比较久,但是它是最近才形成风口的,行业一直没有形成风口和热度的原因是什么?
陈运文认为:之前没有形成风口的原因,一是AI技术本身不够成熟,二是企业数字化程度不高,这两个限制导致RPA之前能够落地应用的场景太少了,所以很难爆发。今天这两个技术条件已经具备以后,大家发现这个RPA能做,那个RPA也能做,甚至企业里很多岗位能够用数字机器人代替,所以一下就火了。
RPA对于技术领域的意义是什么?
金克告诉记者,因为很多人讲RPA本身看上去好像并没有那么难,技术并没有那么高不可攀,但是我们自己判断,要开发出一个真正可靠、可用、像人一样长期稳定运行的系统,是要投入巨大工程开发的力量。
在他看来,RPA对行业意义有两部分:
第一块是任何高精尖技术,真正能够发挥作用的是在于真正落地到每个客户的应用场景里。RPA在这块做得非常好,目前公布的RPA案例甚至国外同行公布的案例,都是非常接地气的,比如帮哪个银行处理票据提升几百倍效率,帮助哪个银行自动化处理订单能够减轻多少人力负担等等,这些都是具体的行业应用场景,而且带来的价值完全是可以量化的,甚至可以算ROI投入产出比,这是非常优秀的。一个技术再也不是天上飘来飘去的概念,而是真正落地扎根到每个场景里,所以落地应用是RPA一个巨大的特点。
第二个特点,能够有巨大工程开发,RPA的开发要耗费巨大的心血和人力,开发RPA产品时,为了适配这么多操作系统、这么多数据库、这么多文件格式,也投入了巨大的力量去做。任何应用系统开发要有水滴石穿的精神,不断打磨产品才能够真正应用起来。工程方面的工作量非常繁重,今天看到展开那么多菜单,每个菜单里的Excel要写非常多代码,能够去自动化处理各个版本Excel文件、完成改查等各种操作。任何技术落地,工程化和产品打磨是非常重要的。
现在对于RPA业界有观点不同的观点:一种认为是RPA对于整个行业具有非常深远的意义,另外一种观点认为RPA现在存在比较明显的短板,不会有深刻的意义,您对于这两种观点的分别评价是怎样?
陈运文表示自己是比较乐观的,他认为RPA对产业未来的影响是非常深远的。软银的孙正义在今年大会上说RPA和AI技术结合在一起能够带来人类经济的第二次大发展,陈运文对他的观点非常赞同。但是怎么把RPA和AI结合在一起很值得思考,他举例说:RPA像人的双手一样可以去工作,AI像人的大脑一样能够思考、能够做决策,把手和脑结合在一起才能够真正发挥作用。如果只有一双手,没有更聪明灵活的大脑,是很难发挥它的作用的。
尤其今天人工智能已经到了真正落地的时代,光有一个大脑,没有双手,也很难发挥作用。为什么2109年中国的RPA市场这么热?陈运文认为,就是大家发现AI技术真正落地时RPA是个最好的通道,所以这两者结合他认为非常乐观,未来可以创造非常多价值。
参考资料:
[1]
https://cloud.tencent.com/developer/news/172491
[2] https://mp.weixin.qq.com/s/WKp9CpnwpQGhvzL6CPmeNQ
[3] https://www.forbes.com/sites/jeanbaptiste/2019/07/03/why-softbank-invested-300-million-in-robotic-process-automation-rpa/#1094af047e6f
[4]
https://www.gartner.com/en/newsroom/press-releases/2019-06-24-gartner-says-worldwide-robotic-process-automation-sof
[5]
https://venturebeat.com/2019/07/28/the-opportunities-in-enterprise-rpa/
像是生活中的任何事情一样,只有通过汗水和时间,才能精通于编程。编程技巧与其他技巧没有什么不同,投入10000小时之后,你也可以成为程序界的大佬。
或许你经常会面临手痒难耐想要编程却想不到要写什么的境况。下面是一些作者认为非常赞的应用程序,每一个熟练的开发者都应该至少构建一种。
Squoosh是一款图像压缩的网页端应用,用户可以深入研究各种图像压缩器所提供的高级选项。
Squoosh示例
通过构建Squoosh程序,可以学到:
如何更改图片大小基本的拖拽API介绍事件监听器(Event listener)以及其API的工作原理文件上传与导出
注:这款图像压缩应用是本地操作,不会上传数据到服务器。用户可以选择在客户端或者服务端进行压缩图片操作。
讲真,计算器?是的,你没听错,一个计算器。理解数运算及其原理在任何稍微有点复杂的程序中都是至关重要的。数字相关的程序开发是迟早要做的,那么为何不提前适应呢?
计算器
通过计算器应用的编写,可以学到
如何与数字和数学运算打交道事件监听器的API程序外观UI的设计
在Layer(图层)的社区中,人们可以在一块共享的画板上一人画一个像素块。这个想法最初是来自Reddit的一个板块,r/Layer,这是一个向所有人开放,任何人都可以创建或者增砖添瓦的创意探索画布。
Layer画布
通过创建Layer,可以学到
JavaScript画布的原理,在一些应用程序中,知道如何操作画布是至关重要的如何协调用户权限。未登录的用户每15分钟可以绘制一个像素块,用户功能是可选项Cookie session的管理
Reddit Layer板块
在人人在用网页爬虫的时代,为什么不自己写上一个呢?网页爬虫在搜索信息的时候非常的实用,在依赖搜索引擎的今天,爬虫的实用度只会随着信息需求的增长而增加。
谷歌(搜索引擎)的网页爬虫
通过编写网页爬虫可以学到:
爬虫的工作原理网页索引以及如何按照口碑和排名展示搜索结果存储带索引的网页至数据库,以及数据库的操作
人人都爱音乐,音乐是我们生活中的一部分。为何不构建一个音乐播放器来更好的理解当代音乐流媒体平台的基本工作机制呢?
Spotify音乐网页版示例
通过编写音乐流媒体平台,可以学到:
如何使用Spotify或者苹果音乐的API如何播放、暂停或者播放上一首歌、下一首歌如何处理播放音量如何管理用户指引或者浏览历史API
感谢阅读,希望诸位都能找到编写应用程序的灵感。
如果你对JavaScript还不熟悉或者是想要学习的话,作者建议可以通过以练带学,推荐书目是A Smarter Way to Learn JavaScript,以及有趣的程序灵感这篇文章。
原文链接:
Here Are 5 Thought-Provoking Apps to Code
今天,胡润首次发布了《2019胡润全球独角兽榜》。榜单显示,金融科技在全球独角兽企业市值中占比达到了22%,而区块链产业也以2%的市值占比榜上有名。有11家区块链企业上榜,分别是:
前不久,美国选科普杂志《科学美国人》将区块链技术纳入了2019十大突破性技术榜单。区块链技术已经成为备受各主流企业和投资人青睐的明星技术,国内外各大公司都开始在区块链上发力。
目前,区块链已经开始在国际贸易、供应链管理、防伪溯源、数据存储等方面发挥重要作用。
区块链技术起源于极客社区,所以发展之初技术领域的进步要超过商业的探索,但随着其应用越来越广泛,其商业价值也在被慢慢被发掘出来。
目前,阿里巴巴、百度、腾讯这样的大公司都在区块链上纷纷发力,并进行布局。对此,溪塔科技市场总监孔庆阳向InfoQ表示:”大公司入局,我们作为创业公司也是很乐意看到的,因为巨头可以利用自身丰富的资源在小型团队所不能尝试的领域进行探索,比如和政府机构,大型国央企,司法,医疗系统的合作。我们也期待巨头们能够把区块链的技术在这些领域内进行应用,碰撞出一些火花,创造新的商业模式。“
但在竞争面前,创业公司也有自己的优势。孔庆阳表示,初创公司的优点在于创新能力比较强,会更贴近于市场。一个大市场是会有很多的细分领域,市场越大,利基市场就越丰富。从这方面来讲,初创企业如果发现机会是很容易集中资源切入,而巨头们可能更多地是要基于自身的体系提升自己的实力,两者的策略是不同的。
孔庆阳表示,区块链是需要依赖在高度信息化以后才可以推行的一个数据治理工具,它在一个行业中使用的先决条件是这个行业本身信息化程度很高。比如,区块链的“交易及结算”的理念就可以运用在清结算、场外交易、供应链金融、DVP等很多场景中。
投资人William Mougayar曾说过,“区块链会是80%的业务流程改变和20%的技术实现。”在区块链商业化过程中,理解客户业务流程并从中找到结合点是很重要的。
不过,现在的互联网信息化技术主要还是在C端应用上,B端普及程度还比较低,所以区块链技术在B端具体落地上成本会比较高,这也是步入区块链商用时代的一大障碍。
区块链没有过去的范例可循,它不是完全的新产物。区块链整体可以算是是数据库、开发平台和网络实现的组合。因此,我们需要它的多种形式和变化。在具体应用的时候,可以采取多种形式。比如,区块链可以视为信用中心、交易媒介、安全通道、去中心化功能等。
我们以企业级区块链内核CITA为例,看看区块链技术如何服务不同的使用者。为了允许使用者更大的操作空间,CITA在整体架构上将区块链的功能分成了六个模块,每个模块都可以以微服务的方式运行,模块之间通过消息总线连接在一起。这样使用者只需要将共识这一个模块重写,而不必改动整体架构。同时,不同的服务放在不同的硬件环境中,可以灵活增加和减少资源来配合不同的业务量。
而对于区块链平台的评估,可以从可编程性、可扩展性、可升级性、交易可管理性、安全性、速度和性能、互用性等方面进行。那么,区块链究竟如何在具体场景中发挥作用呢?
以供应链为例来说,区块链在供应链中的应用是在多方参与的场景中进行的,通过数据的一致性、确权还有不可篡改性来保证数据的安全和便捷。其中,一致性体现在,在一个供应链金融系统中,核心企业,银行和上游供应商之间需要保证持有的数据是一致的。确权体现在数据的所有权不仅不能被篡改,同时要容易被正常的更改。比如在供应链金融中,应收账款是核心企业发给自己的供应商,但在传统模式中,应收账款信用从核心企业流转到上游供应商是比较困难的。而在区块链中,应收可以被通证化的特点使得整个流程更加容易。不可篡改性则减少了一票多用的可能性。
虽然大公司都在用区块链技术,但一家企业在决定采用区块链技术之前有一件事要明确:是否符合自己的战略需要。区块链技术带来的便宜之一就是信息分享,但你的信息是否敏感?数据公开程度怎样?这些都是需要考虑的因素。区块链不是一项在任何场景都可以使用的技术。
孔庆阳表示,区块链公司一般都会选择某一领域,将区块链技术和此场景相结合。所以,当一家“小白”公司决定要引入区块链技术时,应该找相应生态下的区块链供应商,从向多家拥有自己核心技术的公司咨询,详细了解后再从多家公司中选择合适自己的供应商。
成本方面,如果企业是把自己的业务逻辑部分通过区块链实现,可能需要私有化部署,这个成本相对来说是比较高的。如果只想对自己的数据进行一个固化和存证,那可以简单实现,成本相对较低。
收益方面,由于B端决策周期较长,项目推进不会太快,而且区块链本身的使用方式和架构与传统中心化系统差异比较大,需要长期的投入才能帮企业创造出合适的应用,这个过程可能要半年、一年甚至两年,在这种情况下,很快得到回报是不太现实的。
所以,企业需要对自己各方面做好评估再决定是否采用区块链技术,盲目跟风可能导致不必要的损失。
虽然,区块链技术更多面向B端用户,普通消费者很难切实感受到区块链带来的变化,但区块链企业也在真真切切的发展、进步。现在,有了估值800亿人民币企业带来的底气,未来,一切可期。
聪少爱学堂,专注分享全网精准引流方法及自媒体赚钱运营干货。
聪少私人微信:80110557,暗号:8
送见面礼:价值980元自媒体运营与抖音热门教程礼包一份。
或微信扫描下面二维码,马上添加
辅警做什么副业.辅警一个月赚多少钱,为什么那么多年轻2021-07-04
自媒体怎么做副业 适合上班族的副业,在家兼职自媒体,一2021-07-04
神仙有什么副业:整理师一个时薪100元的神仙副业2021-07-04
怎么正确的找副业,肌后:如何找到一个适合自己的副业呢?2021-07-04
怎么样接触副业:一个普通人要如何靠副业月入5万2021-07-04
副业一个月几万 主业月入1万,副业10万,为什么不适合全职2021-07-04
副业淘宝开什么店,以前我下班的时候,也是有副业的。那2021-07-04
把医生当副业好吗,告诉你真实的医生——一个准医生家属2021-07-04
做什么兼职副业 一个上班族适合做哪些兼职或者副业? 分2021-07-04
如何弄一个副业:00后7天赚了17000!年轻人搞副业到底有多2021-07-04