• 开源镜像
  • 开源沙龙
  • 媛宝
  • 猿帅
  • 注册
  • 登录
  • 息壤开源生活方式平台
  • 加入我们

开源日报

  • 2018年10月11日:开源日报第217期

    11 10 月, 2018

    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg


    今日推荐开源项目:《图片转换(误) Image 2 ANSI》传送门:GitHub链接

    推荐理由:这个实际上不能说是图片转换,但你可能会觉得这个看起来有点像之前介绍过的图片转 ASCII 码。这个项目允许你在终端里查看你的图片——你将会看到一团色块,或者是视频——这次是一团会动的色块,平时开惯了电脑自带的图片查看器,这次试试看这种方法兴许不失为一种消遣时间的娱乐。顺带一提,如果把它和你电脑上的摄像头组合起来兴许会变成这个样子……


    今日推荐英文原文:《What’s the Best Programming Language to Learn?》作者:Kaveh Bakhtiyari

    原文链接:https://medium.com/@bakhtiyari/whats-the-best-programming-language-to-learn-958523266037

    推荐理由:大兄弟们停一停,这篇文章可不是选出最好的编程语言,而是帮助初心者选择他们最开始要学习的编程语言的

    What’s the Best Programming Language to Learn?

    Nowadays, there are so many programming languages available in the market, and if you are a beginner in computer programming, you may wonder which programming language is the best to choose and how to start learning it. These are the most frequent questions which I have been asked. Here in this article, I want to answer these questions on how to find the best programming language to start with, and where to start learning it.

    Whenever I hear such question that which language is the best to learn, I reply: “Well, it depends.” Yes, there is no discrete answer to say which language is the best for all purposes. Every language has its own purposes, pros, and cons. Each programming language is good and useful for specific jobs. The right question can be rephrased as: “What is the most relevant or proper language for me to select?” Now, this question is making more sense. Before I answer this, I usually ask few more questions to get a clear understanding of what you actually want.

    1. What do you want to develop?

    If you want to start programming, you must know the area and type of applications/software that you wish to develop. Are you interested in game development? office automation software? scientific calculations? utility software? hardware application? and so on. The answer shows your direction towards programming.

    But what if you do not know the answer, or at least you are not sure about the answer?! There are so many people that they don’t know the answer, and they simply want to start programming. So, you can think about it as what has encouraged you to decide to learn a programming language? Was it an interesting software? Probably, you want to develop a similar software. Or was it a developer? Probably, you want to be like him. Or was it news that you read? Probably, you want to develop the same thing as in the news. Therefore, it is important to know what you are going to do before picking a random language.

    If you know the answer, then you should investigate the most relevant languages and technologies in that area. For example, if you are interested in:

    • automating some of your daily routine tasks: scripting languages — i.e. interpreter based languages — (e.g. Python, JavaScript or VBScript) are recommended.
    • developing nice looking websites: front-end technologies and languages (e.g. HTML, CSS, JavaScript, JQuery, etc.) are recommended.
    • developing web-based applications: back-end technologies and languages (e.g. ASP, PHP, Node.JS, Java, Django Python, Go, etc.) are recommended.
    • working with data and databases: database related languages (such as SQL) and platforms (e.g. MySQL, SQLServer, Mongo, etc.) are recommended.
    • developing enterprise-level software: compiler-based languages (e.g. Java, C++, C#, etc.) are recommended.
    • doing some amazing stuff in artificial intelligence or scientific calculations: Python, R, Go, Julia. Matlab, etc. are recommended.
    • etc.

    As you have seen, for each of these categories (which are not limited to the above list), there are many languages that can be selected from. In this stage, if you know what you want to do, you can target the similar companies and people who are actually doing the similar job as you wish to do to find the most relevant languages and technologies. So you may now have fewer options, but still, there are so many programming languages left. That’s why I ask the second question.

    2. Why and Where do you want to use the language?

    This question might be a bit confusing. Let me rephrase my question. Do you want to learn and use this language for fun and/or solely for your self? or do you want to have it as a skill to get hired? Who is going to use your developed software or code?

    If you are looking for a language with a high demand and a high salary, probably a job search website or LinkedIn can help you much better to check the number of job positions that are available for each language in your region/country.

    For example, a friend of mine, a mechanical engineer, once asked me “what’s the best language to learn?”, and when I asked him: “where do you want to use it?” He replied that he has heard that the mechanical engineers with the programming knowledge may find jobs easily with a higher salary. So, I asked him: “what are those language skills that these companies are expecting from a mechanical engineer?” He said: “Java and Python.” So, he answered himself. When his target market is looking for these two languages, what can I recommend?

    3. How much time are you willing to spend?

    Modern programming languages (e.g. Python) are very easy to learn and code; and they usually do a lot of things behind a scene without you noticing them. That’s a wonderful thing, however, it has some side effects. It causes a slower software with more memory consumption. A similar task in other conventional languages such as C, C++ or Java may require much more lines of code, and you may also need to understand a deeper logic behind the code that you are writing. But they are usually faster, more memory efficient, while it may take decades to master in these languages (especially C++).

    If you want to learn something quick, if you want to code faster, dynamic, and less complex, you can choose Python. If you want something strong, fast and efficient, you can choose C++ or Java. However, it also takes much longer to learn and to code the same thing in C++ versus Python. This generalization is only an example, and it highly depends on your answer to the first question.


    So, by having the answers to the above three questions, you may have fewer options now for your desired language. The next common question is how to learn it?

    How to learn the selected language?

    There are many resources to learn a new programming language or improve the programming skills, such as books, YouTube, online courses, and many more. It does not really matter how you learn it, but you should remember two things regardless of the language that you are learning:

    1. Algorithmic thinking (i.e. Structural thinking) is how you structure a program in your mind, then you convert your thoughts into a code. It is the most important skill for a programmer to develop. Once you master your algorithmic thinking, you can easily learn other languages and extend your programming knowledge. The key materials for Algorithmic Thinking are a good knowledge of the language structure (e.g. syntax), features, as well as mathematics.
    2. Learn the structure. I have seen many programmers that they simply jump over some structures and courses as they assume that they know them or they might not be important. That’s the biggest mistake. As a learner, even as a professional programmer, you should go through all the language structures and syntax details to know the power and capabilities of the new programming language. Missing a single point may cost you more lines of code and frustration in the future.

    What’s the future of the selected programming language?

    In the history of the computer industry, nothing is persistent. A hot and trending language today, maybe a dead and forgotten language tomorrow. So, you should be also prepared for that.

    At the time of writing this article, Python is very popular and it has a high demand today. Thanks to the large community of Python programmers for providing various packages. But will it be hot in the future? That’s a different and difficult question to answer.

    Conclusion

    If you are willing to start the journey of being a computer programmer, you should be clear with yourself about what you are going to develop, where you are going to use it, who is going to use it, and why you are developing it. Then you can easily find resources and people to recommend you the suitable language that meets your needs. There is no discrete and absolute best programming language. Every language is made for a purpose, and it is important to identify yours before choosing the language.

    Programming is not an easy task, it requires patience, lots of practice, thinking, and continuous learning. Good luck for your journey.


    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

  • 2018年10月10日:开源日报第216期

    10 10 月, 2018

    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg


    今日推荐开源项目:《开源浏览器 Wexond》传送门:GitHub链接

    推荐理由:这是一个基于 Electron, React 和 styled-components 的浏览器,尽管它看起来与现在主流的浏览器相比暂时没有太大的优势,但是这只是一个开始,如果想了解项目的进程的话可以去看看 GitHub 上给出的路线图,可以看到这个浏览器正在加入的新功能,兴许有一些会让大家眼前一亮也说不定。


    今日推荐英文原文:《Top 10 Nodejs Frameworks》作者:Lokesh Gupta

    原文链接:https://medium.com/@glokesh94/top-10-nodejs-frameworks-358ce3a4d763

    推荐理由:介绍了十大 Node.js 框架,兴许某一天你会需要它们其中之一,如果你难以选择,文末还给出了一些能够帮助你选择的指标

    Top 10 Nodejs Frameworks

    Before Node.js, web developers always faced the issue of having to use different languages for client-side and server-side scripts. JavaScript was traditionally the language for client-side scripting with the HTML code running in the browser. The invention of Node.js in 2009 introduced server-side scripting with JavaScript code running on the server and generating full dynamic web pages before returning them to the browser. This was a major breakthrough in web development, as Node.js allows using JavaScript both client-side and server-side.

    The huge JavaScript community quickly recognized the advantages of using the same language both for the client-side and server-side scripting, and Node.js has become a popular environment for web development. However, there is no limit to perfection, and developers have created quite a number of frameworks for Node.js development to facilitate the web application development.

    A framework is basically a functional tool that helps JS developers grow their applications. Using a framework allows automating many repetitive processes, using the common libraries and templates and integrating reusable components. With the global popularity of JavaScript, the list of Node.js frameworks is quite long — that’s why we list only those which we use in our projects or consider to be ambitious.

    Express.js

    If you search for Node.js web frameworks, you are sure to come across Express.js very often. Express.js is among the top Node.js frameworks and not without reason — many developers love it for creating an efficient platform for building robust applications and APIs. It is one of the four components of the well-known MEAN stack (MongoDB, Express, Angular, and Node.js) which is a toolset that is very frequently used for building web applications. Here Express serves as a middleware between the front-end, database, and back-end of an application.

    This routing framework is very flexible and lightweight and offers excellent possibilities in terms of using plugins, extensions and third-party databases. Express.js is often referred to as the server framework for Node.js, as it creates an HTTP server for Node.js and supports the middleware functionality needed to respond to the HTTP requests.

    What is ExpressJS?

    Express.js, being one of the most popular web frameworks for Node.js, has a superb set of documentation and enjoys great community support. This means that you will have little trouble finding reusable components and libraries for Express.js. Moreover, it doesn’t require the use of specific development practices or particular tools, so JavaScript developers get the utmost freedom.

    The clear structure created by Express.js is capable of supporting large, feature-rich applications using big data, such as media streaming or live chats. Its excellent scalability possibilities allow building enterprise-size applications with top-quality performance. Using Express.js our DA-14 team built a powerful booking application for tradesmen, called Fixington. This service helps you find reliable tradespeople in a minute and book them online. While another well-known example is Myspace, a social network that, among other functions, supports video and audio sharing as well as online radio. One more case of a great web app designed with Express.js is Yummly, a recipe search website providing personalized cooking recommendations.

    Koa2

    Koa2 is the second version of the Koa framework. Koa is the product of the same team that created Express.js; however, it is rather different from Express.js and not nearly as popular. It is now in the process of heavy development, with version 2 being the stable release of this framework.

    Koa2 belongs to the family of Node.js MVC frameworks, where MVC stands for Model-View-Controller. The three components of MVC are the model which is the data of the application, the view which is the data representation via the app UI, and the controller transferring requests and updates between the model and the view.

    Comparing Koa2 vs Express, the first one is more modular and lightweight with better customization possibilities. Koa2 allows you to start with an application that is almost empty and add only those features you need, as you go along. Also, it has good error-handling capabilities due to its use of generators that allow doing without callbacks and the issues that may be related to them.

    Koa2 uses a number of specific methods which makes it somewhat difficult to learn. Moreover, it requires at least some basic knowledge in promises and generators. In any case, this difficulty should not discourage JavaScript developers appreciating its obvious benefits.

    Sails.js

    Sails.js is another MVC framework for Node.js which was also created by the team behind Express.js; however, it comes with better capabilities than the latter. Diving deeper, Sails comes with an object-rational mapping (ORM) solution to enable the use of literally any database. This Waterline tool saves Node.js developers the trouble of configuring multiple database queries. What is more, this MVC Node.js framework supports Socket.io by default, which makes it one of the best choices for social media apps, messaging tools, and collaborative software solutions.

    Talking about other benefits of Sails.js, it is easily compatible with multiple front-end development platforms without restricting the developers’ choice of their toolset. It uses the same MVC structure as many other frameworks ensuring seamless transitions. The request handling mechanism in Sails.js is the same that is used in Express.js, thus giving it the same quality performance. In general, it’s a good solution for quick and easy building of browser-based apps.

    Sails.js was used in the development of websites for Verizon, a US-based telecommunications company, and the Detroit Lions, an American football team. In total, the homepage of the Sails.js framework lists about two dozen globally-known brands that chose it for their development.

    NestJS

    NestJS is a new kid on the block among Node.js frameworks. It is focused on server-side scripting and is intended to build server-side applications. What makes NestJS different from other Node.js web application frameworks is that it uses TypeScript, a special superset of JavaScript as its programming language. If you are familiar with Angular, which also uses TypeScript, you will have no problem building your backend with NestJS, as components and syntax will look quite familiar.

    This framework has a modular structure organizing code into separate modules. With such structure, using external libraries is much easier. Moreover, the main idea behind Nest.JS is to provide architecture to the applications right out of the box, helping developers build easily maintainable, scalable, and loosely bound software solutions.

    NestJS is now in the first stages of its development; however, it has already made some claims in the web application frameworks sector.

    LoopBack

    LoopBack is another creation of the Express.js team and is built right on top of it. Loopback is an API framework for Node.js allowing you to build APIs that work with any client and can connect various devices. APIs created with LoopBack can be easily connected to backend data sources. LoopBack is also known for the support of multiple databases — Oracle, MongoDB, and SQL.

    Another useful feature of LoopBack is the built-in API explorer allowing software developers to generate API documentation and SDKs.

    Learning LoopBack from scratch may seem a bit difficult; however, once you get proficient enough, you will appreciate its performance. Among the brands that use LoopBack for their websites and applications, you can find such names as GoDaddy, a US-based domain registrar and web-hosting provider, and Symantec developing cyber-security solutions. The DA-14 team employed LoopBack while building Cosmunity, a social media app for geeks that can already boast thousands of fans worldwide.

    Meteor.js

    No list of Node.js frameworks would be complete without Meteor. It is one of the most popular full-stack frameworks for Node.js. It enables easy and straightforward creation of real-time applications. The great thing about Meteor is that it uses the same API on the server side and the client side, thus improving the overall app performance.

    Meteor works properly right out of the box. It suggests a recommended stack, thus you can immediately start working on the application. At the same time, the framework is very flexible and permits the use of any other technology that you find more suitable for a particular task.

    Other advantages of Meteor include its extremely lightweight structure with much fewer lines of code required. Besides, Meteor offers quite a lot of pre-written modules that can be used right away. Also, the vast Meteor community is a source of many reusable packages and modules.

    Meteor uses the same code on multiple devices, and that makes it the perfect choice for creating mobile applications running on different devices. With the same code used across all devices, the updates can be implemented easily.

    Brands such as IKEA, a global furniture company, and Honeywell, a large corporation working on products and services for the Internet of Things sector, use Meteor for their web development.

    Derby.js

    Derby.js belongs to MVC frameworks and can be used both for client-side and server-side script development. Its “crown jewel” is Racer, a data synchronization engine that enables quick and efficient data timing between different browsers and servers and the application database.

    The initial Derby.js package consists of a number of standard Node.js modules. However, you are free to add custom code and integrate third-party modules to build highly efficient web applications.

    The great data synchronization possibilities offered by Derby.js make it an obvious choice for real-time collaboration apps. Quick automatic timing and concurrency allow support of multiple users of the same application with simultaneous editing options. The use of server rendering ensures good search engine support and immediate page loads.

    Hapi.js

    Unlike many other frameworks we’ve mentioned here, Hapi.js has nothing to do with Express.js, and thus may be considered one of its competitors. Hapi.js was first created with the aim of supporting the work of a large distributed team, and since then the framework is considered to be the perfect choice for enterprise-size applications that are built by large and distributed teams.

    Hapi.js enables great collaboration possibilities through focus on plugins that allow working on separate components without affecting the rest of the application. This framework is very well suited for creating reusable components that will help businesses reduce development time.

    Hapi.js framework was used in building the web applications and sites for Walmart retail chain, Yahoo web services provider, and, believe it or not, the UK Government.

    Mean.io

    Mean.io is another full-stack framework, and from its name it is obvious which stack it uses. It offers everything that is needed to start application development right out of the box, thus with Mean.io you can set to work immediately. As it is a complete development stack, there’s no need to select separate components and experiment with them. Moreover, all tools used in this framework are immediately configured to be used together.

    The Mean.io framework includes not only the four components of the MEAN stack, but a number of other web development tools, such as GraphQL and Babel. This way, with Mean.io, you can have a complete JavaScript-based toolset for web application development.

    Mean.io can be used to build applications of all sizes and complexity. The effectiveness of the MEAN stack is well-known in the developers’ community, and quite a lot of web applications and sites have been built using this toolset.

    Total.js

    Total.js is the last in our Node.js web framework comparison list; however, it also deserves our attention. It is an MVC server-side framework that is highly suitable for creating web applications. It is very flexible in terms of compatibility with various databases supporting MongoDB, MySQL, PostgreSQL, and works well with a number of frontend networks, such as Angular, React, and Ember.

    Total.js has a modular structure, and its standard package includes various utilities that can be used in web development, such as an SMTP mail sender tool, an image processing tool, a web server, and others.

    Total.js is great for creating responsive applications at a relatively low maintenance cost and can be relied on to provide sufficient scalability and performance.

    How to choose the Node.js framework

    We have looked at ten of the best-known Node.js frameworks that are available today and have seen that all of them have their strong points. So, how to make the right choice for your project?

    Naturally, you should start with the type of project; analyze its specifics and the way they can be matched by each of the frameworks. You can also factor in such considerations as:

    • availability and completeness of documentation;
    • community size;
    • open issues on GitHub;
    • type of issues it can solve;
    • flexibility;
    • complexity;
    • compatibility with other tools you are planning to use.

    At the same time, all frameworks are meant to ease the development process. Thus, each of them is going to add quality and raise the performance of your application.


    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

  • 2018年10月9日:开源日报第215期

    9 10 月, 2018

    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg


    今日推荐开源项目:《浏览器操作录制 Puppeteer Recorder》传送门:GitHub链接

    推荐理由:顾名思义,这个 Chrome 上的 Recorder 能帮你录制你在浏览器上的操作,然后生成一个脚本。虽然这听起来很像按键精灵什么的,但是兴许你不仅可以把它用来重复操作,还能在调试的时候帮上忙,虽然现在能够记录的元素点击事件并不算多,但是以后还会扩展,可以期待一下。


    今日推荐英文原文:《Functional Programming Basics》作者:Robert C. Martin (Uncle Bob)

    原文链接:https://pragprog.com/magazines/2013-01/functional-programming-basics

    推荐理由:介绍函数式编程,兴许有些人已经听说过这玩意了,在这里你可以看到与平常的面向对象的语言截然不同的代码和操作方式

    Functional Programming Basics

      Confused about functional programming? “Uncle Bob” Martin strips the paradigm down to its essentials, and explains why you can and must understand functional programming now.  

    By now you’ve almost certainly heard of functional programming. I mean, how could you miss it? Everybody’s talking about it. There are all these new functional languages coming out like Scala, F#, and Clojure. People are talking about older languages too, like Erlang, Haskell, ML, and others.

    So what’s this all about? Why is functional programming The Next Big Thing ™? And what in blazes is it?

    First, it’s almost certainly true that functional programming is the next big thing. There are good solid reasons for this that we’ll explore later in this article. But in order to understand those reasons, we need to know what functional programming is.

    I’m going to upset a lot of people with this next statement because I’m going to resort to extreme minimalism. I’m going to reduce functional programming down to its simplest core; and this isn’t really fair because the topic is rich and expressive and full of wonderful concepts. You’ll see hints of some of them here. But for now, I’ll simply define functional programming this way:

    Functional programming is programming without assignment statements.

    Oh no! Now I’ve gone and done it. The functional programmers out there are gathering their pitchforks and torches. They want my head for uttering such minimalist blasphemy. Meanwhile all the folks who hoped to learn what functional programming really is are about to stop reading because the above statement is so blatantly absurd. I mean: how in the world can you program without assignment?

    The best way to explain that is to show an example. Let’s look at a very simple program in Java: the squares of integers.

     	public class Squint {
     	     public static void main(String args[]) {
     	          for (int i=1; i<=25; i++)
     	               System.out.println(i*i);
     	     }
     	}

    Who hasn’t written that program, or some simple variant of it? I must have written it many hundreds of times. It’s often the second program I write in a new language, and the second or third program I teach new programmers to write. Everybody knows the good old squares of integers!

    But let’s look at it closely. It’s just a simple loop with variable named i that counts up from 1 to 25. Each loop through the program causes the variable i to take on a new value. This is assignment. A new value is being assigned to the variable i every pass through the loop. If you could somehow peer into the memory of the computer and stare at the memory location that held the value of i, you would see the value held by that memory change from one iteration of the loop to the next.

    If the previous paragraph seemed to have belabored an obvious point, let me point out that whole papers have been written on this topic. The concepts of identity, value, and state may seem intuitive to us, but they are actually a very rich topic in and of themselves. But I digress.

    Let’s look at a functional program for the squares of integers. We’ll use the language Clojure for this, though the concepts we’re going to explore work the same in any functional language.

    (take 25 (squares-of (integers)))

    Yes, you are reading that correctly; and yes, that is an actual program that produces actual results. If you must see the results they are:

    (1 4 9 16 25 36 49 64 ... 576 625)

    There are three words in that program: take, squares-of, and integers. Each of those words refers to a function. The left parens in front of those words simply mean: call the following function and treat everything up to the closing right paren as its arguments.

    The take function takes two arguments, an integer n, and a list l. It returns the first n items of l. The squares-of function takes a list of integers as its argument and returns a list of the squares of those integers. The integers function returns a list of integers in sequential order, starting at 1.

    That’s it. The program simply takes the first 25 elements of a list of the squares of sequential integers starting at 1.

    Read that sentence again; because I did something important there. I took the three separate definitions of the functions that I gave you in the preceding paragraph and combined them into a single sentence. That’s called: (are you ready for the buzzword?) Referential Transparency. [cue: Fanfare, glitter, ticker tape, cheering crowds]

    Referential Transparency simply means that, in any given sentence, you can replace the words in that sentence with their definitions, and not change the meaning of the sentence. Or, more importantly for our purposes, it means that you can replace any function call with the value it returns. Let’s see this in action.

    The function call (integers) returns (1 2 3 4 5 6 …). OK, I know you’ve got questions about this, right? I mean, how big is this list? The real answer is that the list is only as big as I need it to be; but let’s not think about that just now. For the moment just accept that (integers) returns (1 2 3 4 5 6 …); because it does!

    Now, in our program, we can replace the function call (integers) with its value. So the program simply becomes:

    (take 25 (squares-of (1 2 3 4 5 6 ...)))

    Yes, I did that with copy and paste; and that’s also an important point. Referential Transparency is the same as copying the value of a function call and pasting it right on top of that function call.

    Now, let’s do the next step. The function call (squares-of (1 2 3 4 5 6 …)) simply returns a list of the squares of the numbers in its argument list. So it returns (1 4 9 16 25 36 49 64 …). If we replace this function call with its value, our program simply becomes:

    (take 25 (1 4 9 16 25 36 49 64 ...))

    And, of course, the value of that function call is simply:

    (1 4 9 16 25 36 49 64 ... 576 625)

    Now let’s look at our program again:

    (take 25 (squares-of (integers)))

    Notice that it has no variables. Indeed, it has nothing more than three functions and one constant. Try writing the squares of integers in Java without using a variable. Oh, there’s probably a way to do it, but it certainly isn’t natural, and it wouldn’t read as nicely as my program above.

    More importantly, if you could peer into the computer’s memory and look at the memory locations used by my program, you’d find that those locations would be initialized as the program first used them, but then they would retain their values, unchanged, throughout the rest of the execution of the program. In other words, no new values would be assigned to those locations.

    Indeed, this is a necessary condition for Referential Transparency, which depends on the fact that every time you invoke a particular function call, you will get the same result. The fact that computer memory for my program does not change while my program is executing means that the call (f 1) will always return the same value no matter how many times it is called. And that means I can replace (f 1), wherever it appears, with its value.

    Or to say this another way: Referential Transparency means that no function can have a side effect. And, of course, that means that no variable, once initialized, can ever change its value, since assignment is the quintessential side effect.

    So why is this important? What’s so great about Referential Transparency? Given that it is possible to write programs without assignment, why is it important?

    You are almost certainly reading this on the screen of your computer. Or if not, you have a computer nearby. How many cores does it have?

    I’m typing this article on a MacBook Pro with 4 real cores. (They say it has 8, but I don’t count all that “hyperthreading” nonsense. It has four.) My previous laptop had two cores. And the one before that had just one. The only conclusion I can draw is that my next laptop will truly have eight cores; and the one after that will likely have 16.

    The poor hardware engineers, who have carried us on their backs for the last four decades, have finally hit the speed of light limit. Computer clocks simply aren’t going to get much faster. After doubling every 18 months for longer than most programmers (except me) have lived, the runaway growth in computer speed has slammed to a halt, never to rise again.

    So those hardware engineers, in an effort to give us more and more cycles per second, have resorted to adding more processors into our chips, and there seems no end to how many processors that will lead to as the years march onwards.

    So let me ask you this, O skilled and competent programmer: How are you going to take advantage of every computer cycle available to you when your computer has 4096 cores in it? How will you marshal your function executions when they must run within 16384 processors all contending for the same memory buss? How will you build responsive and flexible websites when your models, views, and controllers must share 65536 processors?

    Honestly, we programmers can barely get two Java threads to cooperate. And threads are baby-food compared to the meat and potatoes of real processors fighting over the buss. For over half a century programmers have made the observation that the processes running in a computer are concurrent, not simultaneous.

    Well, boys and girls, welcome to the wonderful world of simultaneity! Now, how are you going to deal with it?

    And the answer to that is, simply, “Abandon all assignment, ye who enter here.”

    Clearly, if the value of a memory location, once initialized, does not change during the course of a program execution, then there’s nothing for the 131072 processors to compete over. You don’t need semaphores if you don’t have side effects! You can’t have concurrent update (pardon me: Simultaneous Update) problems if you don’t update!

    So that’s the big deal about functional languages; and it is one big fricking deal. There is a freight train barreling down the tracks towards us, with multi-core emblazoned on it; and you’d better be ready by the time it gets here.

    Robert Martin (Uncle Bob) (@unclebobmartin) has been a programmer since 1970. He is the Master Craftsman at 8th Light inc, an acclaimed speaker at conferences worldwide, and the author of many books, including: The Clean Coder, Clean Code, Agile Software Development: Principles, Patterns, and Practices, and UML for Java Programmers. He is a prolific writer and has published hundreds of articles, papers, and blogs. He served as the Editor-in-chief of the C++ Report, and as the first chairman of the Agile Alliance.

    A somewhat different version of this article, as well as much more about functional programming, can be found at the author’s blog. You can send him your feedback on this article or discuss the article in the magazine forum.


    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

  • 2018年10月8日:开源日报第214期

    8 10 月, 2018

    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg


    今日推荐开源项目:《不仅是 Windows Proton》传送门:GitHub链接

    推荐理由:有了这个,你就能在 Linux 和 macOS 上玩 Steam 上的 Windows 限定游戏了。这玩意开源出来最大的目的就是提供给那些需要自定某些设置的用户,它是基于 Wine 的,所以可以更改所使用的 Wine 的版本之类的,不过对于大多数用户来说,直接使用原版会更方便一些,等以后你也开着 Linux 想玩 Steam 游戏的时候,别忘了还有这么个工具。


    今日推荐英文原文:《Eight Must Have Non Technical Skills For Software Development》作者:Sarah Elson

    原文链接:https://medium.com/@sarahelson81/eight-must-have-non-technical-skills-for-software-development-141e7b213b6

    推荐理由:有些技能并非技术类,但是你会发现它们很管用,它们的作用域并非仅限于软件开发中,换句话说,学习他们总是没错的

    Eight Must Have Non Technical Skills For Software Development

    Non-technical Skills are acknowledged as interactive skills. It comprises of communication skills, skills for teamwork, and decision-making skills. It is not like those technical skills, but can be a compliment to those to make them more efficient and effective. If used effectively, it provides invaluable safety and active operations. It will be easier to make the work done efficiently. Many successful developers are renowned in their field because of the possession of good nontechnical skills.

    There are some universal needs for achieving a useful result, and the nontechnical skills are one of them. It is helpful in case of software development, testing, and other related technological aspects. Skills like programming, database, frameworks are essential for achieving great height in your career, but you can’t overlook non-technological skills, which make you successful in the world of technology. It can be coined as integral parts. They are equally essential like those technical skills. There are a lot of Non technical skills to make you successful. Let’s have an idea about those fields.

    1. Ability to Communicate

    Communication skill remains at the topmost position, whenever we make a list of nontechnical skills. To commence a significant project the central aspect is communication. An excellent communication leads to successful completion of a said project. You all know a project or say one software development lifecycle houses different sets of people. And they are quite diverse. So they should be fitted in the right position to make out the desired result. And that can be achieved only through proper communication. The collaboration and relation among all only give a fruitful outcome. So in simple word communication is highly significant in software development.

    2. Categorize the Tasks According to Priority

    It is another essential aspect for the completion of the software development cycle. During the period, things are quite fast. You have to accomplish the things a proper way, that also promptly. The time management and focus play a vital role in this. So to be able to work in a fast-paced environment you should have to prioritize the works so that you can match your colleagues and provide a successful result.

    3. Analysis of Customer Requirements

    It is known as the ability to understand and share the feelings of others. It is highly required as it is much more than the knowledge of software development, data, and metrics. In an environment of software development, you have to understand your end users. You have to analyze, the requirement of your end users. The customer’s empathy is the prime focus that you have to look after, rather than focusing on your preferences.

    4. Work Should be Systematized

    To make a successful software development cycle, proper reporting and documentation skills are highly essential. Apart from that, you have to be organized in your work. And you should always keep this in mind that, it is not a one man show. It is teamwork, and that will only provide success to your endeavor.

    Say, you have to systemize your browser testing, a proper procedure should be followed. So, systematic approach is a must.

    If you’re still wondering about how to systemize your cross browser testing strategy, refer to our blog to know more.

    5. Uniqueness and Creativity

    Creativity Software development is not only about math and science. It’s not about the technical aspects alone. The innovative mind, and out-of-the-box thinking will allow you to go to the heights in this field. And with the application of these aspects, you will be there in the long run. Being a master of technical skills you can sustain in this field, but there won’t be significant progress for you. And you will remain to do a nine to five job. So always try to play with the amalgamation of technical skills and innovative approaches.

    6. Ability to Provide Insights

    An individual with vast technical skills can develop any software, and that is a common thing. But the crucial thing is he should have a deeper understanding of it. He should have the ability to explain it to the users. With that, only the developer can get a successful tag. So in short, you should have the insight of progress or any test results. It can carry your product to the next level.

    For example: A tester should be able to use various analytics tools like google analytics. These tools help you in understanding the cross browser requirements of the audience and other insights that can help to understand user and user behavior to simplify testing and development efforts.

    7. Willingness to Explore and Think Out of The Box

    The aspect of software development requires this nontechnical skill. You should have the interest. If you are curious, then only you can load your brain with innovative and advanced knowledge. You will never feel your job boring, and always in the process of learning some new things. It will provide new feather to your career and allow you to unlock new possibilities in the areas of software development. In addition to that, you will also forget the fear of making mistakes.

    8. Open to Learning and Staying Updated About New Technologies

    Nothing is constant here, so as technology. The ideas, procedures, and aspects of software development, testing is changing every other day. There is no specific way of producing software applications. So it is highly significant to look after diverse opinions for software development. You have to consider the suggestions made by others, accept other’s feedback for executing your ideas in a better and newly developed way. Last but not the least you have to be proactive and let your eyes open every time.

    You have to consider those nontechnical skills as an integral part of software development. It is equal to these technical skills for the proper execution of software development and technology. For achieving the tag of a successful tester or developer, you must have these soft skills. It is indeed the foundation for becoming an expert. So go through the soft skills, for making yourself a good contributor. And practice these nontechnical skills more often.


    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

←上一页
1 … 205 206 207 208 209 … 262
下一页→

Proudly powered by WordPress