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

开源日报

  • 2018年12月26日:开源日报第293期

    26 12 月, 2018
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《成为命名大师 codelf》
    今日推荐英文原文:《Would you let an AI Camera in your home?》

    今日推荐开源项目:《成为命名大师 codelf》传送门:GitHub链接
    推荐理由:还在为了给变量取名字而烦恼?放下你手上那本婴儿命名大全吧,它只会给你带来生命危险。这个项目能够让你简单方便的找到一个合适的变量名字——只需要 CodeLF 一下。它可以作为 VSCode,Atom 或者 Sublime Text 的插件来安装,或者也可以使用网页版。如果你想知道它究竟从哪弄来的这么多变量名,就按一下这些名字对应的 Repo 吧,它们并不是凭空出现的。

    今日推荐英文原文:《Would you let an AI Camera in your home?》作者:Alexandre Gonfalonieri
    原文链接:https://medium.com/swlh/would-you-let-an-ai-camera-in-your-home-1292cd558193
    推荐理由:智能相机兴许会很管用,但是用它是拍不到圣诞老人的

    Would you let an AI Camera in your home?


    Are you thinking about buying an AI security camera for your home? It sounds like a good purchase for your home safety.

    Cameras can already connect to wi-fi and have been an integral part of our smart devices for years, but they haven’t had “minds” of their own.

    The world of automated surveillance is booming, with new machine learning techniques giving cameras the ability to spot troubling behavior without human supervision. Indeed, new deep learning techniques have enabled us to analyze video footage more quickly and cheaply than ever before.

    This type of A.I. for security is known as “rule-based” because a human programmer must set rules for all of the things for which the user wishes to be alerted. This is the most prevalent form of A.I. for security. The hard-drive that houses the program can either be located in the cameras themselves or can be in a separate device that receives the input from the cameras.

    This is one of the key driving factors behind the push to bring AI and video surveillance together. The idea is that advanced software could supplement human judgment and provide for more accurate and safe surveillance.

    Cameras are really important

    From saving lives to keeping us safe

    Boston was full of cameras. But none of them was able to detect the threat represented by the intentionally abandoned backpacks, each containing a bomb. The video footage was predominantly analyzed by the eyes of the police department attempting to identify and locate the perpetrators. However, due to both the slow speed and low accuracy of the alternative computer-based image analysis algorithms, we might have waste time.

    Automated analytics algorithms are conceptually able, for example, to sift through an abundance of security camera footage in order to pinpoint an object left at a scene and containing an explosive device or other contents of interest to investigators. And after capturing facial features and other details of the person who left the object, analytics algorithms can conceptually also index image databases from social media and private sources in order to rapidly identify the suspect.

    How do artificial intelligence and embedded vision processing intersect? Computer vision is a broad, interdisciplinary field that attempts to extract useful information from visual inputs, by analyzing images and other raw sensor data. The term “embedded vision” refers to the use of computer vision in embedded systems.

    Historically, image analysis techniques have typically only been implemented in complex and expensive, therefore niche, surveillance systems. However, the previously mentioned cost, performance, and power consumption advances are now paving the way for the proliferation of AI home cameras.

    Why do we need AI cameras?

    Let me give you an example… As more consumers move towards online shopping and have their items delivered to their doorstep, the risk of having these packages stolen has increased.

    It would be great if we can stop worrying about our packages thanks to an AI camera.

    Indeed, smart cameras with built-in AI capabilities offer new conveniences, like a phone notification that a child just arrived home safely, or that the dog walker really did walk the dog.

    For example, many users opt to have their camera notify them as soon as it recognizes that their kids have arrived home from school. The system’s machine learning capabilities enable it to execute more complex functions, as well, such as sending an alert when an elderly live-in parent doesn’t appear in the kitchen by a certain time of day.

    Facial recognition in still images and video is already seeping into the real world. Some companies have created a program where facial recognition is used instead of tickets for events. The venue knows who you are, maybe from a picture you upload or your social media profile, sees your face when you show up and knows if you’re allowed in.

    All these things do improve our security, there is no question about this. However, they will also bring new risks to privacy in public and private spaces. Indeed, companies are exploring how smart cameras can be used to gather marketing data.

    Limits

    As great as they are, we need to be careful…

    A Google patent from 2016 described how cameras in a home could use visual clues like books and musical instruments to learn about a person’s interests, and suggest content they might like. However, Google declined to comment…

    Many functions envisioned for smart cameras depend on transmitting information they’ve detected, such as faces they’ve identified. We should worry that smart-home enthusiasts may give up data on themselves that they didn’t intend to share. Users of several smart speakers and other smart-home devices show they tend to blindly trust their gadgets won’t betray them, and pay little mind to privacy settings or disclosures, but for how long?

    So what’s a privacy-minded, law-abiding citizen to do when surveillance becomes the norm?

    Not much. Early research has identified ways to trick facial recognition software, either by specially-made glasses to fool the algorithms or face paint that throws off the AI. But these often require knowledge of how the facial recognition algorithm works.

    Another issue would be that some companies are gathering data on customers through special cameras at shops and outlets so the collected information will be analyzed and their sales improved.

    Indeed, an increasing number of businesses are setting up permanent cameras separately from security ones to enable recorded facial images to be analyzed with artificial intelligence.

    Could such AI security cameras be trained to look for specific types of people, compounding existing biases? Is it easy to hack into the 24-hour video footage taken with these security cameras, or to hack into the AI and change its directive?

    Filmed faces are regarded as a sort of citizens’ personal information. The government allows such data to be used for commercial purposes, if it is deleted after captured people’s age and other properties are analyzed, raising concerns among experts over personal privacy.

    Behavior analysis is something that a lot of tech companies are researching.

    Nobody wants to feel like Big Brother is constantly watching. Several companies already assure people that these systems know when to stop collecting information. For example, a camera in the home can be told to shut down when certain “intimate” situationsarise.

    My opinion is that the integration of AI technology into advanced camera systems is something that’s inevitable and exciting. But if you happen to purchase one of these cameras, you need to make sure about the privacy element…

    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
  • 2018年12月25日:开源日报第292期

    25 12 月, 2018
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《Python 程序大全 awesome-python-applications》
    今日推荐英文原文:《Frameworks VS. Fundamentals》

    今日推荐开源项目:《Python 程序大全 awesome-python-applications》传送门:GitHub链接
    推荐理由:一个好的开源 Python 程序集合,它们不仅可以拿来用,而且可以作为借鉴的对象。一个可以正常运作的程序可以成为我们开发过程中的借鉴对象,兴许你在使用 Python 开发软件的时候可以在这里面寻找同类型的进行借鉴来解决遇上的问题,这会比去 Google 的海洋里寻找答案要来的容易些。
    今日推荐英文原文:《Frameworks VS. Fundamentals》作者:Dose of Ted
    原文链接:https://medium.com/@doseofted/frameworks-vs-fundamentals-3bfeac80b1c6
    推荐理由:先学习框架还是先学习基础知识,这是个问题

    Frameworks VS. Fundamentals

    If you’ve checked Twitter lately, it’s hard to not have a stance on whether or not developers should be learning frameworks first or language fundamentals first (Twitter thread here) if you are a developer. With that said, and considering I’ve spent a lot of time learning fundamentals myself, I’d like to offer my opinion on the topic.

    TL;DR: it doesn’t really matter but your life will be easier with the basic fundamentals. However, there’s a lot more to this that can’t be summed up in a single paragraph. So, I’d like to offer my opinion of the topic as a current Computer Science student so that I can decide for myself which is better and how I should learn in the future. How I Learned (not how everyone else should learn)

    I’ve been interested in computers for as long as I can remember but didn’t start learning to program until a teacher of mine in middle school gave me his old Computer Science textbook back when he thought he was going to become a game developer (he was a student teacher for my science class). I learned the very basics of the C++ language including functional and object-oriented programming, functions, classes, pointers, pointers to pointers, pointers to pointers to … you get the idea: the boring stuff, as opposed to the fun things that I can make now. The next year, I ditched C++ in favor of JavaScript and the occasional Bash scripting (I made themes in Cydia, back when that was a thing). After that, I went to school and switched majors to Computer Science in my sophomore year. I had to sit through the basic classes again with topics that I already learned in middle school (yawn) but I also learned some useful algorithms and practices that software developers should follow. These past two years, I have taught myself more fundamentals related to Java, Swift, and C#. Mostly C#.

    Fundamentals are key, right?
    In short: only partially. I learned a lot about the fundamentals but I didn’t do much with them. Sure, I made a few console programs and I made programs that I thought were cool as a beginner but beyond sitting on my own computer, occasionally opening them up in free time, they didn’t serve much of a purpose other than to show that I’ve learned the fundamentals. Otherwise, they collected dust. I suppose that almost every beginner’s programs do the same even if they choose to learn frameworks first but when we start building programs, we have to understand what they do and if we encounter an issue, and we will, then how do we approach solving it? You have to know the fundamentals. Fundamentals are key and allow us to build better apps. It allows us to debug easier and have an actual understanding of our application or web page.

    However, not all fundamentals will serve us well. I’ve learned a lot of the “fundamentals” when it comes to ECMAScript 6 based JavaScript and while what I’ve learned is useful and saves me time, I could easily get by without knowing a thing about it and could even use super old ECMAScript 3 based JavaScript.

    I could take this a step further and say that I may be able to use a front-end framework without knowing all of the fundamentals. I could use a library like jQuery or Zepto without needing to know basic DOM interaction (although using them will expose you to the basics). Maybe I could use React and a UI library without knowing much about HTML (not that there’s much to know). I could learn to use Bootstrap framework for styling instead of learning CSS first. We could possibly build better and more useful apps by just learning the basics as we go. The problem with this is when we encounter a problem in code. This is when it pays to knows the basics first because you can more easily find the problem.

    While it pays to know the fundamentals, sometimes the fundamentals and certain frameworks go hand-in-hand to make something useful and sometimes a language itself is pointless without certain frameworks.
    Everything is a Framework

    Try making a user interface without using a single framework. If you program in C, then GTK+ is out. Can’t we use OpenGL? Framework. Okay, can’t we use the X library (if we really hate ourselves)? I think to an extent, we could call this a framework. The same applies to web development, more so even. When using JavaScript, there are countless frameworks for front-end development where frameworks last a year or two before we decide they’re not “cool” anymore (exaggerating a bit, of course many are still used). The bare minimum tools needed to build a website are basic HTML and vanilla JavaScript where we use the set of APIs (you could call a framework) provided to us by the browser.

    My point is that we abstract away from the fundamentals and to build anything useful: there’s a framework needed. We don’t use assembly or binary. We don’t build all of the code that we need. We use higher-level languages and code built by others to build something useful. When learning the basics, it’s impossible not to use a framework because some of these lower-level frameworks, as I call them, are often closely related to the basics. We all build off of each other’s work.

    Anyway, back to the topic at hand, this discussion about whether you should learn a framework or the basics first is more about higher-level frameworks that abstract so far away from system or browser frameworks that you don’t need to know how they work to build something, instead you can learn as you go. In the world of web development, developers are using frameworks that abstract far from the basic browser APIs. These frameworks are so abstracted away from browser APIs that developers can sometimes use them without needing to know some basics about browser-given APIs. So, do you still need the basics of JavaScript and browser APIs if you can get the general gist of things by learning a framework? For small applications used for a short period of time or for basic websites: maybe not. The problem is when we build large applications and then come across a problem. Sometimes fixing a problem involves more than fixing our code to run a framework. Sometimes these problems involve the fundamentals. While we can learn the fundamentals as we learn frameworks, if we had learned the fundamentals first then we would be able to solve these issues much faster.

    Time is Our Most Valuable Asset

    The most important takeaway from this topic is that our time is limited and we need to learn what we need to know as fast as we can so that we can make something useful. The question is: how do we get there? Of course, we’ll all take our own different path but I think that the correct choice is to choose balance. It is important to know the fundamentals. I don’t think anyone is arguing against them but learning how to use a library by itself is confusing when you need to do anything more than the basics and there are not many programmers who are paid to make programs that say “hello world” in a console window or a basic HTML page. In order to do anything with a framework, we need to know the basics and sometimes convoluting the basics of a language with a framework make understanding what you’re coding much more difficult and take even more time, especially when debugging.

    That’s not to say that it can’t be done. Back when I was in middle school, jQuery may have been a fine way to introduce JavaScript rather than learning the basics. I taught myself JavaScript instead and when I look back, I may have been able to save time by just using jQuery. I taught myself basic C++ but learning C++ with the help of a framework like GTK+ (or a binding for C++) would have allowed me to build better, more useful applications faster.

    The problem is that I may not be understanding what’s going on when I use these frameworks. Often times, I don’t need to know. However, I need to know some of these fundamentals first so that I can learn and use these frameworks faster and debug potential problems related to me not knowing the basics.

    I think it’s important to have a strong foundation to build on top of but you can also learn a framework first and come across the fundamentals along the way and become an excellent developer that way. However, if you want to learn to develop software as fast as you can without wasting time then the very basic fundamentals should be learned first without frameworks. After the basics, learning frameworks becomes easier because you can relate concepts back to the basics. Using a framework, we don’t have to understand everything that’s going on (that’s sort of the point) but we need to understand it on some level and with the fundamentals, that will be easier.

    I’m only a CS student offering another limited opinion but if you’re building a house on rocky foundation, that house won’t be there long but with a strong foundation it can stand for many, many years.
    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
  • 2018年12月24日:开源日报第291期

    24 12 月, 2018
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    • 今日推荐开源项目:《全家福 all-contributors》
    • 今日推荐英文原文:《On Programming Languages, Culture, and Benchmarks》

    今日推荐开源项目:《全家福 all-contributors》
    推荐理由:这是一个规范——所有对开源项目做出过贡献而不仅仅是提供了代码的贡献者都应该得到认可。这个项目中包括了有关这个规范的一些细节和具体要求,兴许它会为之后的开源项目所有者都提个醒——一个开源项目并不只是需要代码的,代码以外的东西和代码都一样重要,为这些东西提供帮助的贡献者一样应该得到应有的认可。
    今日推荐英文原文:《On Programming Languages, Culture, and Benchmarks》作者:Jon Bodner
    原文链接:https://medium.com/capital-one-tech/on-programming-languages-culture-and-benchmarks-87869fa88ba6 推荐理由:对 Go 和 Java 进行比较——在文化和基准测试两方面

    On Programming Languages, Culture, and Benchmarks

    4 Comparisons Between Go and Java
    One thing that non-programmers often find surprising about programming is that different languages have different communities with different cultures. These cultures dictate things both large (how people decide what new features are added to a language) and small (tabs vs. spaces). They also pop up in interesting ways. Recently, I was pulled into a discussion about the cost of reflection in Java vs. the cost in Go. I didn’t know the answer, so I wrote some benchmarks to see what the difference was. The most interesting part wasn’t the results, it was the design philosophy around benchmarking and what it revealed about the cultures of the respective languages. Here’s what I observed.
    1. Benchmarking is a core part of Go, an optional part for Java
    Go’s benchmarking support is integrated into the testing package that’s built into the standard library. Documentation on writing and running benchmarks is included as part of the standard documentation. The benchmarks are included as part of the project that is being benchmarked.
    In Go, benchmarks are run with the command go test -bench=.. The . is a regular expression for the name of the benchmark functions you want to run; a dot means to run everything. There are additional flags as well that control other aspects of benchmarking, like whether to benchmark memory in addition to performance, or how long to run the benchmarks. And, as we’ll discuss in a bit, this integration with the standard distribution has other implications as well.
    Java’s approach is different. The standard Java benchmarking library is JMH. Even though it is written and maintained by Oracle, it isn’t bundled with the standard library. The recommended way to use JMH is to create a separate benchmarking project. Developers then use maven (the popular third-party project management tool) to run this not-so-simple command:
    mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=org.openjdk.jmh -DarchetypeArtifactId=jmh-java-benchmark-archetype -DgroupId=org.sample -DartifactId=test -Dversion=1.0
    
    When it’s time to run your JMH benchmarks, the standard way is to use the commands mvn clean install; java -jar target/benchmarks.jar. This builds and runs the benchmarks in your benchmark project. There are options, lots of them. The JMH code runner has over 30 command line flags. If that’s not enough control, you can write your own code runner and configure the options directly:
    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(MyBenchmark.class.getSimpleName())
                .forks(1)
                .timeUnit(TimeUnit.NANOSECONDS)
                .mode(Mode.AverageTime)
                .build();
        new Runner(opt).run();
    }
    
    One effect of including a standard benchmark runner in Go is that I have seen many more examples of benchmarking in Go than benchmarking in Java.
    2. Declaring benchmarks is surprisingly similar between Java and Go
    To create a benchmark in Go, you add a new function to a test file in your project. Test files are simply files whose names end in test.go. Each benchmark function’s name starts with the word Benchmark and takes in a single parameter of type testing.B. This follows on from the pattern for testing in Go, which uses a function whose name starts with the word Test and takes in a single parameter of type testing.T. What is interesting is that configuration by function name is a bit more “magical” than the usual Go style. As a general design rule, Go favors explicit invocation over implicit invocation. But in the case of testing and benchmarking, Go relies on a test runner that looks for functions with particular name structures to know that they should be invoked. This style stands out in Go because it is so uncommon.
    Creating benchmarks with JMH is similar to the process in Go. You create a new class to hold the benchmarks, and then annotate benchmark methods with @Benchmark. Since the benchmarks are in separate project from the code being measured, you use maven to reference your code as a library. This is a common pattern for Java; annotations are used to mark methods that are expected to behave in a special manner, and there’s a part of the program whose job is to scan the classpath and find methods marked with the annotation, so they can be executed.
    3. Writing a benchmark in Go asks more from developers than Java does, but gives them more control over timing
    Writing a benchmark in Go is a bit more complicated than writing one in Java. Benchmarking requires multiple runs to get accurate measurements. In Go, you need to explicitly set up the loop for the benchmark run using a value supplied by the benchmark runtime. I also had to write my own blackhole function to eat the output so that it wouldn’t be optimized away by the compiler. If you want to set up some data before the test runs, or if you want to exclude some logic from being timed, you can explicitly stop, start, and reset the timer:
    func BenchmarkNormalSetPointer(b *testing.B) {
            d := &Data{A: 10, B: “Hello”}
            b.ResetTimer()
            for i := 0; i < b.N; i++ {
                    normalSetPointer(d)
            }
    }
    
    func normalSetPointer(d *Data) {
            d.A = 20
            blackhole(d)
    }
    
    Java’s benchmarking only requires the actual business logic. The looping is done for you, and JMH provides a blackhole utility class to swallow output to prevent optimizing it away:
    @Benchmark
    public void normalSetPointer(Data data, Blackhole blackhole) {
        data.a = 20;
        blackhole.consume(data);
    }
    
    In order to set up the data for the benchmark and exclude the set up time from the measurements, JMH requires you to create a static inner class and annotate it as being “State”:
    @State(Scope.Thread)
    public static class Data {
        public int a = 1;
        public String b = “hello”;
    
        public String getB() {
            return b;
        }
    }
    
    When using JMH, I couldn’t find a way to exclude part of the time inside of a benchmark or to reset the timings.
    4. Go’s benchmarks have limited configuration and good integration. Java’s are the opposite.
    Go’s benchmarking isn’t very configurable. You can specify that the benchmarks run for a specific number of times, for a minimum duration, or with a specific number of CPU cores. When you run benchmarks, the output is written to the console in the units that make sense to the benchmarking tool:
    BenchmarkDoNothing-8          2000000000 0.29 ns/op
    BenchmarkReflectInstantiate-8   20000000 110 ns/op
    BenchmarkNormalInstantiate-8  2000000000 0.29 ns/op
    BenchmarkReflectGet-8           10000000 156 ns/op
    
    You can also get the results in JSON:
    {"Time":"2018–06–29T12:11:39.731321926–04:00","Action":"output","Package":"github.com/jonbodner/reflect-cost","Output":"BenchmarkDoNothing-8 \t"}
    {"Time":"2018–06–29T12:11:40.355509283–04:00","Action":"output","Package":"github.com/jonbodner/reflect-cost","Output":"2000000000\t 0.30 ns/op\n"}
    {"Time":"2018–06–29T12:11:40.355845048–04:00","Action":"output","Package":"github.com/jonbodner/reflect-cost","Output":"BenchmarkReflectInstantiate-8 \t"}
    {"Time":"2018–06–29T12:11:42.667043237–04:00","Action":"output","Package":"github.com/jonbodner/reflect-cost","Output":"20000000\t 109 ns/op\n"}
    
    Unfortunately, the JSON output is not very useful. First of all, while each line is valid JSON, there is no wrapping array or object around all of the lines; you have to construct one yourself. You might expect that each benchmark would generate a JSON record with separate fields for the name of the benchmark, the number of iterations it took to get a stable answer, the time it took, and the units. Instead, the records have an “Output” field, that requires you to merge the value of consecutive records to reconstruct the text output, which then needs to be split on tabs and spaces to find the desired values. Given these limitations, it’s easier to forgo the JSON, direct the text output to a file, and parse.
    Go benchmarks are not limited to timing information. They integrate with Go’s built-in code coverage and profiling support, giving you the option of displaying memory allocation information and allowing you to write both timing and memory information to profiling files that can be run through the pprof tool included with Go.
    JMH is very configurable. You can choose the time units (ns, ms, etc.), whether you want throughput (ops/time), average time (time/op), sampling time, or a single run time. You can have the output in text, CSV, SCSV, JSON, or LaTeX. You can get it to output some memory or threading profiling results. However, I don’t know of any way to use this output with another tool. If you want to get more detailed information, you’ll need to upgrade to something else.
    Programming Language Culture Matters
    As someone who has spent decades writing Java, and several years writing Go, I find these kinds of comparisons fascinating. Lately, I’ve been enjoying writing Go more than writing Java. I think the culture of Go better reflects how I like to write software, and benchmarking is another area where Go’s approach agrees with my thinking. Go takes the “batteries included” approach to its standard library and tooling; you get quite a lot included as part of the standard distribution, but that also means accepting the choices made by the team that maintains Go. By including simple benchmarking support as part of the standard library and tooling, and integrating it with a profiling toolkit that’s bundled with the Go development tools, you get a “good enough” solution for the most common cases. But it’s one that requires you to do some extra work (write your own benchmarking loops and blackhole function) and doesn’t do things that the Go team considers unimportant (such as usable JSON output).
    There’s nothing wrong with Java’s approach if you agree with the Java design philosophy and culture of Java development. While benchmarking support isn’t included in the JDK, Java does bundle some profiling tools like jhat, jstat, and hprof. Unfortunately, they are either considered experimental or produce poor results. Other tools, like JVisualVM and Java Mission Control, have been open sourced and future development is unsure. The net result is that Java relies on third parties to provide large parts of its developer tooling. This has encouraged a robust third-party ecosystem, but this philosophy makes it harder to get started if you don’t know where to begin. Also, it is sometimes difficult to get tools to work together. Libraries in Java tend to have lots of configuration choices as the Java ecosystem is focused on configurability. There’s probably no better way to understand the different attitudes about configurability between Java and Go than by looking at their garbage collectors. There are over 50 different flags that you can set to configure the behavior of the multiple garbage collectors included in the JVM. Go has only one garbage collector and there is only one configuration flag for that collector.
    In both cases, these choices are not intrinsic to the language; they are entirely artifacts of culture. This is what makes language wars a bit foolish. Which language you prefer to use is more a matter of the culture that suits your programming style best, and less a matter of the actual functionality the language provides. It’s also a matter of exposure; if you don’t try other languages, you’ll never know if there’s a better culture fit for you out there. Don’t disparage other languages; give them a try and see how they work for you. You might be surprised where you end up.

    • 下载开源日报APP:https://opensourcedaily.org/2579/
    • 加入我们:https://opensourcedaily.org/about/join/
    • 关注我们:https://opensourcedaily.org/about/love/
  • 2018年12月23日:开源日报第290期

    23 12 月, 2018
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    • 今日推荐开源项目:《自然语言处理课程 nlp_course》
    • 今日推荐英文原文:《“Your app will be finished on Tuesday.” — which Tuesday?!》

    今日推荐开源项目:《自然语言处理课程 nlp_course》
    推荐理由:一个按周进行教学的自然语言处理课程,课程内容包含讲座和研讨会,以及课程作业和相关的文章,如果对自然语言处理感兴趣的话可以来尝试着学习一下,讲座和研讨会的内容都是以视频的形式提供的,所以可能会需要一点英语基础,在尝试之前也不要忘了根据它的要求安装所需要的库。
    今日推荐英文原文:《“Your app will be finished on Tuesday.” — which Tuesday?!》作者:Tomer Dicturel
    原文链接:https://medium.com/swlh/your-app-will-be-finished-on-tuesday-which-tuesday-bffaa90d20ca
    推荐理由:软件开发计划失败的十个原因,避开它们吧

    “Your app will be finished on Tuesday.” — which Tuesday?!

    If you search online for trends in software development you’ll find an endless supply of information on booming technologies and how tech is going to impact every sector by 2020. We hear about all the amazing changes new technology will have ad nauseam, but I’m here to question the latter part of the previous sentence. “By 2020”. For those of you who don’t speak “software engineer”, that means 2040. As the only guy at Crane.ai that doesn’t write code, I’ve been plagued by this problem for the longest time. Of course, non-coders are also part of the problem; this post was originally going to be about 5 reasons why software development projects fail, but in full client fashion I changed the spec halfway through the project and so it’ll now be about 10 reasons why software development projects fail.
    1. Poorly defined (or, god willing, undefined!) outcome
    “Mobile app? We built a bridge, does that work?”
    One of the largest problems plaguing software development projects is a poorly defined outcome. Without proper definition as to what the “end product” should be, a project is guaranteed to fail. This is so vital that it could quite possibly change the direction of the project itself (which is why it’s #1 on my list!). I highly recommend building a specification sheet to better identify what the product will look like, what it will do, and how it will do it. More on this under communication and expectations!
    2. Solving the wrong problem.
    “We built a new wooden bridge that looks way prettier than the old one. Cars? Oh, no, it can’t support cars. Pretty much anything heavier than a bird will break it.”
    Another common issue is solving the wrong problem. This lies along the same lines as a poorly defined outcome, yet is much broader in scope. Although you can properly identify your end product and solve the other issues discussed here, if your solution does not properly address the problem then you’ve gotten nowhere with the project. One way to solve this is to incrementally ideate. Identify your core problem, what steps could be taken to solve it, and a possible solution. Next, constantly iterate the product through with your end user — maintain a constant review process to ensure the project is properly addressing the needs of your user, and remains a solution to your core problem.
    3. Not enough communication.
    “We built half a bridge, they built half a tunnel.”
    Coming in at #3 is the core problem plaguing virtually every project, industry, and business — communication. Communication is vital at every level of a software development project. At an internal level, your developers need to communicate effectively to ensure they build tools and pipelines that in coordination and are properly compatible. A common solution here is to draft specifications beforehand for design, APIs, and any other engineering required in your project. This is vital to saving hundreds of hours of time that could otherwise be wasted in refactoring and restructuring. At a higher level, it’s also important to properly communicate with other teams. The marketing team, for example, needs to know what is technologically feasible before selling the concept. Failure to communicate at this level can cause project-shattering issues; the product could end up being severely detached from what was sold, promised, built and needed.
    4. No plan or timeline.
    “Yeah… it’ll get done around like… maybe a couple weeks? Not sure what we’re gonna do after that…”
    Regardless of whether timelines and plans are adhered to, it’s important to have one. It provides your project with a sense of structure and gives you an estimate as to when and how tasks will be completed. Of course, a good plan reaches much further. A good plan or timeline can also serve as a common border for large teams, allowing them to operate quickly and efficiently in sprints. If a feature falls through or needs more time, then the plan/timeline can be adjusted quickly, and the budget adjusted accordingly.
    5. Lack of accountability.
    “The buck stops… over there, bye!” — Harry Truman, probably
    When shit hits the fan, someone has to be ready with a mop. If a feature falls through, it should be clear who is accountable and what steps should be taken to prevent this in the future. It sounds childish but a common occurrence in the software development industry is “pointing fingers.” The backend engineers will blame the frontend engineers will blame the sales team will blame the marketing team will blame the legal office will blame the management will blame… This process is not only time consuming and disastrous for morale, but it leaves the core question — “what went wrong?” — open and unanswered.
    6. Moving the goalposts too often.
    *“Ok, but now the bridge needs to also act as a runway, have 10 more lanes, and how about a park in the middle of it?”
    * It’s important to keep track of a project’s goals and make sure they are met in a timely fashion. While it is possible that a project needs to be expanded or the requirements have changed, making frequent modifications to the “end goal” can not only devastate morale, but make a project outright impossible. Often times, changes are unplanned and require extensive refactoring; over time, this leads to a large amount of wasted time, and eventually a failed project. What may seem like a small change at first could end up becoming a long-term development project.
    7. Inadequate documentation and tracking.
    “The instructions to defuse this bomb say to pull the red wire once the power cuts off, but all of the wires are red and the power was supposed to be cut 10 minutes ago!” — James Bond, at what will be the end of his career
    It’s great to follow an agile methodology and move fast, but documentation is always important. Undocumented code can lead to years of technical debt and can cause tremendous issues down the road — “what does this function do?” It’s equally important to document the product. Every step of the process from ideation to design to execution should be well-documented to ensure that the project is easily navigable for others and stays on track. Good documentation can allow for easier project tracking — in an agile system, try a kanban board or similar to keep track of tasks!
    8. Badly defined system requirements.
    “WTF do you mean there’s only 5 loaves and 2 fish for all 5000 of us?!”
    The technical requirements of a project can be hard to gauge, but it is extremely vital that you do so. What may seem like a small extra addition may turn into a turducken of an issue, involving allocating additional infrastructure and redefining the entire system to introduce support.
    9. Poor preparation.
    “We’re still flying half a ship.”
    Often times a project is exciting and easy to jump into; however, it is vital to its success for the proper preparation to take place. Specifications need to be created, designs must be drafted, a timeline should be agreed on, and resources should be allocated. A popular method of managing this at a technical level is Test Driven Development. Before writing a single line of code towards a project, plan out the architecture and what each piece needs to accomplish. Next, write tests to assert that each piece actually does what was intended. In this manner, you have a framework ready with set goals and can quantify progress on the development of your product.
    10. Unrealistic expectations.
    “Ok, the app looks good — but why doesn’t the color scheme automatically change to match the user’s phone case?”
    It’s important to manage expectations. Often times, the client asks for a feature that is unreasonable, impractical, or flat-out impossible. A common practice is to limit the number of changes that can be made to a spec and to have an engineer present during discussions to determine if the proposed feature is technologically feasible. Hopefully, by avoiding these 10 pitfalls, your next software development project will be an astounding success! What issues have you run into in your software projects?
    • 下载开源日报APP:https://opensourcedaily.org/2579/
    • 加入我们:https://opensourcedaily.org/about/join/
    • 关注我们:https://opensourcedaily.org/about/love/
←上一页
1 … 186 187 188 189 190 … 262
下一页→

Proudly powered by WordPress