├── .gitignore ├── .travis.yml ├── README.md ├── _config.yml ├── _markbind ├── layouts │ ├── body.md │ ├── default.md │ ├── footer.md │ ├── landing.md │ ├── links.md │ ├── sitenav.md │ ├── toc.md │ └── topnav.md └── variables.md ├── about.md ├── contents ├── ToC.md ├── ai │ ├── classactivationmaps.jpg │ └── ml.md ├── android │ └── IntroToAndroid.md ├── architecture │ └── RESTArchitecturalStyle.md ├── c++ │ └── rvalue.md ├── codeQuality │ └── CodeQualityMetrics.md ├── computerVision │ ├── cv.md │ ├── image-classification-1.png │ ├── image-classification-2.png │ ├── image-classification-example-1.jpg │ ├── image-classification-example-2.jpg │ ├── image-transformation-example-1.jpg │ ├── image-transformation.png │ ├── object-detection-example-1.jpg │ ├── object-detection-example-2.jpg │ ├── object-detection.png │ ├── object-tracking-example-1.jpg │ ├── object-tracking-example-2.jpg │ ├── object-tracking-example-3.jpg │ ├── object-tracking-example-4.jpg │ └── object-tracking.png ├── csharp │ ├── CSAsyncAwait.md │ ├── IntroductionToCSharp.md │ ├── Xamarin.md │ ├── async-await-app-example1.png │ ├── async-await-app-example2.png │ ├── async-await-app-example3.png │ ├── async-await-control-flow.png │ ├── async-await-deadlock.png │ ├── xamarin-forms-architecture.png │ └── xamarin-forms-screenshot.png ├── dart │ └── Dart.md ├── data │ ├── databases │ │ ├── databases.md │ │ └── images │ │ │ └── db-dbms-relation.png │ ├── nosql │ │ ├── NoSQL.md │ │ ├── databaseSurvey.png │ │ ├── diagrams.pptx │ │ ├── documentDatabaseStructure.png │ │ └── horizontalScalability.png │ └── sql │ │ ├── DBFiddle.png │ │ ├── MySQL_Workbench.png │ │ ├── MySQL_cli.png │ │ ├── SQL.md │ │ └── SQL_API.png ├── devops │ └── DevOps.md ├── docker │ ├── Container.png │ ├── Docker.md │ ├── DockerHub.png │ ├── Docker_Architecture.png │ ├── Docker_Logo.png │ ├── Docker_Microservices.jpg │ ├── Docker_Statistics.png │ ├── Docker_logo_011.0.png │ ├── VMvsContainer.png │ └── Virtual_Machine.png ├── dotfiles │ ├── Dotfiles.md │ ├── cd-autocomplete.gif │ ├── default-prompt.png │ ├── enhanced-prompt.png │ ├── git-flag-autocomplete.gif │ └── syntax-highlighting.gif ├── elm │ ├── Elm.md │ └── images │ │ └── TEA.png ├── functionalProgramming │ └── intro.md ├── go │ └── Go.md ├── gpgpu │ ├── cuda.md │ ├── drivenet.jpg │ ├── gpgpu.md │ ├── gpgpu_architecture.png │ └── jetson_tx2.jpg ├── haskell │ └── Haskell.md ├── ios │ └── IntroToIos.md ├── java │ ├── JUnit.md │ ├── JavaConcurrency.md │ ├── JavaReflections.md │ ├── JavaSynchronization.md │ ├── Spring.md │ ├── assertFailed.PNG │ ├── assertPass.PNG │ ├── spring-overview.png │ ├── streams-an-introduction.md │ └── thread_interference.png ├── javascript │ ├── First_example.png │ ├── Javascript-framework-Angular.md │ ├── Javascript-framework-React.md │ ├── Javascript-framework-Redux.md │ ├── Javascript-framework-VueJs.md │ ├── Javascript-libraries.md │ ├── Javascript-modules.md │ ├── Javascript-promises.md │ ├── WritingTestableJavascript.md │ ├── data.jpg │ ├── dependency.png │ ├── file.png │ ├── html.png │ ├── javascript-framework-react-images │ │ └── ReactVirtualDOM.png │ ├── javascript-framework-redux-images │ │ └── 3basiccomponents.png │ ├── javascript-framework-vue-images │ │ └── vue-lifecycle-diagram.png │ └── staticTypingInJavascript.md ├── kotlin │ ├── NullSafety.md │ └── kotlin.md ├── naturalLanguage │ ├── constituencyParse.png │ ├── dbsChatbot.png │ ├── nl.md │ ├── openIE.png │ ├── partsOfSpeech.png │ ├── word2vec.png │ └── wordNet.png ├── node │ ├── eventloop.png │ └── nodejs.md ├── performance │ ├── Performance.md │ ├── PerformanceProfiling.md │ ├── ProfilingDesktopAppVS2015.md │ └── WebPerformance.md ├── projectManagement │ ├── AgileDevelopment.md │ ├── documentation.md │ ├── githubActions.md │ └── images │ │ ├── actions-tab.png │ │ ├── editor.png │ │ ├── effectiveSteps.jpg │ │ ├── mantra.jpg │ │ ├── marketplace.png │ │ ├── progress.png │ │ ├── projectManagement-agileDev-iterations.jpg │ │ ├── status.png │ │ └── tddSteps.jpg ├── python │ ├── introduction-to-python.md │ └── numpy.md ├── regex │ └── Regex.md ├── revisionControl │ └── bestPracticesGit.md ├── ruby │ ├── Rails.md │ ├── Ruby.md │ └── mvc.jpeg ├── rust │ └── Rust.md ├── scala │ └── Scala.md ├── scalability │ └── scalable-development.md ├── security │ ├── Https.md │ ├── crossSiteRequestForgery │ │ └── crossSiteRequestForgery.md │ ├── crossSiteScripting │ │ ├── crossSiteScripting.md │ │ └── images │ │ │ └── StatisticGraphic.png │ ├── cryptography.md │ ├── passwordStorage.md │ ├── passwordStorage │ │ ├── P.png │ │ ├── W.png │ │ ├── cheese.png │ │ └── pigpen.png │ └── sqlInjection.md ├── shells │ ├── bash.md │ ├── check-file.png │ └── check-permission.png ├── staticAnalysis │ ├── ESLint.md │ ├── FindBugs.md │ ├── PMD.md │ ├── checkStyle.md │ └── intro.md ├── swift │ └── welcome-to-swift.md ├── testing │ ├── images │ │ └── tddSteps.jpg │ ├── integration-test │ │ ├── big-bang-integration.png │ │ └── sample-architecture.png │ ├── integration-testing.md │ ├── security-testing.md │ ├── security-testing │ │ ├── Sec-Test-Fig-1.png │ │ └── Sec-Test-Fig-2.png │ ├── testDrivenDevelopment.md │ └── writing-testable-code.md ├── uix │ ├── accessibility.md │ ├── accessibility │ │ ├── alt-tag.png │ │ ├── bg-new.png │ │ ├── bg-old.png │ │ ├── fb-achromatopsia.png │ │ ├── fb-deuteranopia.png │ │ ├── fb-more-indicators.png │ │ ├── fb-normal.png │ │ ├── lh-audit.png │ │ ├── tc-blurred.png │ │ ├── tc-normal.png │ │ ├── website_protanopia.png │ │ └── website_trace.png │ ├── design-systems.md │ ├── refining-ux-skills.md │ └── uix.md └── zeromq │ └── zeromq.md ├── contributing.md ├── css └── main.css ├── favicon.ico ├── index.md └── site.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Eclipse template 3 | _site/ 4 | .metadata 5 | bin/ 6 | tmp/ 7 | *.tmp 8 | *.bak 9 | *.swp 10 | *~.nib 11 | local.properties 12 | .settings/ 13 | .loadpath 14 | .recommenders 15 | 16 | # Eclipse Core 17 | .project 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # PyDev specific (Python IDE for Eclipse) 26 | *.pydevproject 27 | 28 | # CDT-specific (C/C++ Development Tooling) 29 | .cproject 30 | 31 | # JDT-specific (Eclipse Java Development Tools) 32 | .classpath 33 | 34 | # Java annotation processor (APT) 35 | .factorypath 36 | 37 | # PDT-specific (PHP Development Tools) 38 | .buildpath 39 | 40 | # sbteclipse plugin 41 | .target 42 | 43 | # Tern plugin 44 | .tern-project 45 | 46 | # TeXlipse plugin 47 | .texlipse 48 | 49 | # STS (Spring Tool Suite) 50 | .springBeans 51 | 52 | # Code Recommenders 53 | .recommenders/ 54 | ### JetBrains template 55 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 56 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 57 | 58 | # User-specific stuff: 59 | .idea/workspace.xml 60 | .idea/tasks.xml 61 | .idea/dictionaries 62 | .idea/vcs.xml 63 | .idea/jsLibraryMappings.xml 64 | 65 | # Sensitive or high-churn files: 66 | .idea/dataSources.ids 67 | .idea/dataSources.xml 68 | .idea/dataSources.local.xml 69 | .idea/sqlDataSources.xml 70 | .idea/dynamic.xml 71 | .idea/uiDesigner.xml 72 | 73 | # Gradle: 74 | .idea/gradle.xml 75 | .idea/libraries 76 | 77 | # Mongo Explorer plugin: 78 | .idea/mongoSettings.xml 79 | 80 | ## File-based project format: 81 | *.iws 82 | 83 | ## Plugin-specific files: 84 | 85 | # IntelliJ 86 | /out/ 87 | 88 | # mpeltonen/sbt-idea plugin 89 | .idea_modules/ 90 | 91 | # JIRA plugin 92 | atlassian-ide-plugin.xml 93 | 94 | # Crashlytics plugin (for Android Studio and IntelliJ) 95 | com_crashlytics_export_strings.xml 96 | crashlytics.properties 97 | crashlytics-build.properties 98 | fabric.properties 99 | 100 | .idea/ 101 | learningresources.iml 102 | _markbind/logs/ 103 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '8' 4 | install: 5 | - npm i -g markbind-cli 6 | script: markbind build && markbind deploy --travis 7 | branches: 8 | only: 9 | - master -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Learning Resources for Software Engineering Students 2 | 3 | This repository is a collection of Software Engineering learning resources. 4 | 5 | **Click [here](https://se-edu.github.io/learningresources/) to start exploring the resources**. 6 | 7 | --- 8 | 9 | [Guidelines for Contributors](https://se-education.org/learningresources/contributing.html) | [Contact](https://se-education.org/learningresources/about.html) | License: MIT 10 | 11 | 12 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-leap-day -------------------------------------------------------------------------------- /_markbind/layouts/body.md: -------------------------------------------------------------------------------- 1 |
2 | {% include "_markbind/layouts/sitenav.md" %} 3 |
4 | 5 | # ****A Student's Guide to Software Engineering Tools & Techniques »**** 6 | 7 | {{ content }} 8 |
9 | {% if page_nav %} 10 | 15 | {% endif %} 16 |
17 | -------------------------------------------------------------------------------- /_markbind/layouts/default.md: -------------------------------------------------------------------------------- 1 | {% include "_markbind/layouts/links.md" %} 2 | {% include "_markbind/layouts/topnav.md" %} 3 | {% set page_nav = "true" %} 4 | {% include "_markbind/layouts/body.md" %} 5 | {% include "_markbind/layouts/footer.md" %} 6 | -------------------------------------------------------------------------------- /_markbind/layouts/footer.md: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /_markbind/layouts/landing.md: -------------------------------------------------------------------------------- 1 | {% include "_markbind/layouts/links.md" %} 2 | {% include "_markbind/layouts/topnav.md" %} 3 | {% include "_markbind/layouts/body.md" %} 4 | {% include "_markbind/layouts/footer.md" %} 5 | -------------------------------------------------------------------------------- /_markbind/layouts/links.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /_markbind/layouts/sitenav.md: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /_markbind/layouts/toc.md: -------------------------------------------------------------------------------- 1 | * ****Programming Languages**** 2 | * C++ 3 | * [Rvalue References and Move Semantics]({{baseUrl}}/contents/c++/rvalue.html) 4 | * CSharp 5 | * [Introduction to CSharp]({{baseUrl}}/contents/csharp/IntroductionToCSharp.html) 6 | * [Asynchronous Programming in C#]({{baseUrl}}/contents/csharp/CSAsyncAwait.html) 7 | * [Dart]({{baseUrl}}/contents/dart/Dart.html) 8 | * [Elm]({{baseUrl}}/contents/elm/Elm.html) 9 | * [Go]({{baseUrl}}/contents/go/Go.html) 10 | * [Haskell]({{baseUrl}}/contents/haskell/Haskell.html) 11 | * Java 12 | * [Java Concurrency]({{baseUrl}}/contents/java/JavaConcurrency.html) 13 | * [Java Streams]({{baseUrl}}/contents/java/streams-an-introduction.html) 14 | * [Java Synchronization]({{baseUrl}}/contents/java/JavaSynchronization.html) 15 | * [Java Reflection]({{baseUrl}}/contents/java/JavaReflections.html) 16 | * [JUnit]({{baseUrl}}/contents/java/JUnit.html) 17 | * JavaScript 18 | * [Writing Testable JavaScript Code]({{baseUrl}}/contents/javascript/WritingTestableJavascript.html) 19 | * [Javascript Promises]({{baseUrl}}/contents/javascript/Javascript-promises.html) 20 | * [Javascript Modules]({{baseUrl}}/contents/javascript/Javascript-modules.html) 21 | * [Static Typing in JavaScript]({{baseUrl}}/contents/javascript/staticTypingInJavascript.html) 22 | * Kotlin 23 | * [Introduction to Kotlin]({{baseUrl}}/contents/kotlin/kotlin.html) 24 | * [Null Safety In Kotlin]({{baseUrl}}/contents/kotlin/NullSafety.html) 25 | * Python 26 | * [Introduction to Python]({{baseUrl}}/contents/python/introduction-to-python.html) 27 | * [NumPy]({{baseUrl}}/contents/python/numpy.html) 28 | * [Ruby]({{baseUrl}}/contents/ruby/Ruby.html) 29 | * [Rust]({{baseUrl}}/contents/rust/Rust.html) 30 | * [Scala]({{baseUrl}}/contents/scala/Scala.html) 31 | * [Swift]({{baseUrl}}/contents/swift/welcome-to-swift.html) 32 | * ****SE Topics**** 33 | * Architecture 34 | * [REST]({{baseUrl}}/contents/architecture/RESTArchitecturalStyle.html) 35 | * Code Quality 36 | * [Code Quality Metrics]({{baseUrl}}/contents/codeQuality/CodeQualityMetrics.html) 37 | * [Documentation]({{baseUrl}}/contents/projectManagement/documentation.html) 38 | * [Functional Programming]({{baseUrl}}/contents/functionalProgramming/intro.html) 39 | * Performance 40 | * [Introduction to Performance Optimization]({{baseUrl}}/contents/performance/Performance.html) 41 | * [Performance Profiling]({{baseUrl}}/contents/performance/PerformanceProfiling.html) 42 | * [Web Performance]({{baseUrl}}/contents/performance/WebPerformance.html) 43 | * Project Management 44 | * [Agile Development]({{baseUrl}}/contents/projectManagement/AgileDevelopment.html) 45 | * [DevOps]({{baseUrl}}/contents/devops/DevOps.html) 46 | * [Github Actions]({{baseUrl}}/contents/projectManagement/githubActions.html) 47 | * Revision Control 48 | * [Best Practices with git]({{baseUrl}}/contents/revisionControl/bestPracticesGit.html) 49 | * [Scalability]({{baseUrl}}/contents/scalability/scalable-development.html) 50 | * Static Analysis 51 | * [Introduction to Static Analysis]({{baseUrl}}/contents/staticAnalysis/intro.html) 52 | * [CheckStyle]({{baseUrl}}/contents/staticAnalysis/checkStyle.html) 53 | * [PMD]({{baseUrl}}/contents/staticAnalysis/PMD.html) 54 | * [FindBugs]({{baseUrl}}/contents/staticAnalysis/FindBugs.html) 55 | * [ESLint]({{baseUrl}}/contents/staticAnalysis/ESLint.html) 56 | * Testing 57 | * [Integration Testing]({{baseUrl}}/contents/testing/integration-testing.html) 58 | * [Security Testing]({{baseUrl}}/contents/testing/security-testing.html) 59 | * [Test-Driven Development]({{baseUrl}}/contents/testing/testDrivenDevelopment.html) 60 | * [Writing Testable Code]({{baseUrl}}/contents/testing/writing-testable-code.html) 61 | * UI/UX 62 | * [Accessibility]({{baseUrl}}/contents/uix/accessibility.html) 63 | * [Design Systems]({{baseUrl}}/contents/uix/design-systems.html) 64 | * [Introduction to UI/UX]({{baseUrl}}/contents/uix/uix.html) 65 | * [Refining UX Design Skills]({{baseUrl}}/contents/uix/refining-ux-skills.html) 66 | * ****App Frameworks**** 67 | * [Android]({{baseUrl}}/contents/android/IntroToAndroid.html) 68 | * [Angular]({{baseUrl}}/contents/javascript/Javascript-framework-Angular.html) 69 | * [iOS]({{baseUrl}}/contents/ios/IntroToIos.html) 70 | * [Node]({{baseUrl}}/contents/node/nodejs.html) 71 | * [React]({{baseUrl}}/contents/javascript/Javascript-framework-React.html) 72 | * [Redux]({{baseUrl}}/contents/javascript/Javascript-framework-Redux.html) 73 | * [Ruby on Rails]({{baseUrl}}/contents/ruby/Rails.html) 74 | * [Spring]({{baseUrl}}/contents/java/Spring.html) 75 | * [Vue]({{baseUrl}}/contents/javascript/Javascript-framework-VueJs.html) 76 | * [Xamarin]({{baseUrl}}/contents/csharp/Xamarin.html) 77 | * ****Tools Useful for Software Engineers**** 78 | * [Regular Expressions]({{baseUrl}}/contents/regex/Regex.html) 79 | * [Docker]({{baseUrl}}/contents/docker/Docker.html) 80 | * [ZeroMQ]({{baseUrl}}/contents/zeromq/zeromq.html) 81 | * [Dotfiles]({{baseUrl}}/contents/dotfiles/Dotfiles.html) 82 | * ****Other Topics**** 83 | * [Computer Vision]({{baseUrl}}/contents/computerVision/cv.html) 84 | * Databases 85 | * [DBMS]({{baseUrl}}/contents/data/databases/databases.html) 86 | * [SQL]({{baseUrl}}/contents/data/sql/SQL.html) 87 | * [NoSQL]({{baseUrl}}/contents/data/nosql/NoSQL.html) 88 | * [Machine Learning]({{baseUrl}}/contents/ai/ml.html) 89 | * Multi-Threading 90 | * [GPGPU]({{baseUrl}}/contents/gpgpu/gpgpu.html) 91 | * [CUDA]({{baseUrl}}/contents/gpgpu/cuda.html) 92 | * [Natural Language Processing]({{baseUrl}}/contents/naturalLanguage/nl.html) 93 | * Security 94 | * [Cross Site Request Forgery]({{baseUrl}}/contents/security/crossSiteRequestForgery/crossSiteRequestForgery.html) 95 | * [Cross Site Scripting]({{baseUrl}}/contents/security/crossSiteScripting/crossSiteScripting.html) 96 | * [Cryptography]({{baseUrl}}/contents/security/cryptography.html) 97 | * [HTTPS]({{baseUrl}}/contents/security/Https.html) 98 | * [Password Storage]({{baseUrl}}/contents/security/passwordStorage.html) 99 | * [SQL Injection]({{baseUrl}}/contents/security/sqlInjection.html) 100 | * Shell 101 | * [bash]({{baseUrl}}/contents/shells/bash.html) -------------------------------------------------------------------------------- /_markbind/layouts/topnav.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | :fas-chevron-circle-left: ****SE-EDU**** 4 |
  • **Home**
  • 5 |
  • **About**
  • 6 |
  • **Contributing**
  • 7 |
  • :fab-github:
  • 8 | 13 |
    14 |
    15 | -------------------------------------------------------------------------------- /_markbind/variables.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/_markbind/variables.md -------------------------------------------------------------------------------- /about.md: -------------------------------------------------------------------------------- 1 | 2 | title: "About Us" 3 | layout: "landing.md" 4 | 5 | 6 |
    7 | 8 | # About Us 9 | 10 | This is a sub-project of the [SE-EDU Project](https://se-edu.github.io). 11 | 12 | 13 | ## Contact 14 | 15 | Suggestions, questions, and bug reports can be posted in [our issue tracker](https://github.com/nus-oss/learningresources/issues). 16 | 17 | 18 | Alternatively, contact project mentor [Damith C. Rajapakse](https://www.comp.nus.edu.sg/~damithch). 19 | 20 | 21 | ## License 22 | 23 | MIT 24 | 25 | ## Acknowledgements 26 | 27 | * The `favicon.ico` is based on an icon made by [Dave Gandy](https://www.flaticon.com/authors/dave-gandy) from www.flaticon.com 28 |
    29 | -------------------------------------------------------------------------------- /contents/ToC.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /contents/ai/classactivationmaps.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/ai/classactivationmaps.jpg -------------------------------------------------------------------------------- /contents/codeQuality/CodeQualityMetrics.md: -------------------------------------------------------------------------------- 1 | 2 | title: Code Quality Metrics 3 | pageNav: 3 4 | 5 | 6 |
    7 | 8 | # Code Quality Metrics 9 | 10 | Authors: [Wilson Kurniawan](https://github.com/wkurniawan07) 11 | 12 | 13 | 14 | * [Overview‎](#overview) 15 | * [Examples of Metrics‎](#examples-of-metrics) 16 | * [Complexity Metrics‎](#complexity-metrics) 17 | * [Class Design Metrics‎](#class-design-metrics) 18 | * [Package Design Metrics‎](#package-design-metrics) 19 | * [Seemingly Trivial Metrics‎](#seemingly-trivial-metrics) 20 | * [Define Your Own Metric‎](#define-your-own-metric) 21 | * [Making Sense of It‎](#making-sense-of-it) 22 | * [Code Quality Metrics Tools‎](#code-quality-metrics-tools) 23 | 24 | 25 | ## Overview 26 | 27 | - It is undisputed that developers, code reviewers, testers, QA team members, and software architects alike want code to be as simple, understandable, and (put more positive adjectives here) as possible. 28 | - It is, however, disputable how "simple", "understandable", etc. is defined, because they are all qualitative. What is "..." for one person may not be so "..." for another; in fact, it may not be so for that person three months later. 29 | 30 | A quantitative approach needs to be adopted to measure those qualities precisely. **Code Quality Metrics** is the answer. It provides a **quantitative measure** of the quality of a piece of code. 31 | 32 | > Since quantitative measurements are essential in all sciences, there is a continuous effort by computer science practitioners and theoreticians to bring similar approaches to software development. 33 | > The goal is obtaining objective, reproducible and quantifiable measurements, which may have numerous valuable applications in schedule and budget planning, cost estimation, quality assurance testing, software debugging, software performance optimization, and optimal personnel task assignments. 34 | > 35 | > https://en.wikibooks.org/wiki/Introduction_to_Software_Engineering/Quality/Metrics 36 | 37 | In fact, [the Boeing 777 project attributed its success to excellent usage of Quality Metrics (both code and non-code)](https://thesai.org/Downloads/Volume3No1/Paper%2021-Survey%20on%20Impact%20of%20Software%20Metrics%20on%20Software%20Quality.pdf). 38 | 39 | *Note that the term "Code Quality" here is scoped to be the readability, understandability, and maintainability of the code. While performance can be considered a legitimate basis for some metrics (e.g. time taken to run certain operations, based on profiling), it is not considered for this purpose.* 40 | 41 | ## Examples of Metrics 42 | 43 | ### Complexity Metrics 44 | 45 | Complexity metrics measure how "complex" methods, classes, packages, etc. are. "Complex" here is defined as difficult to understand and difficult to maintain. 46 | 47 | They are arguably the most useful metrics for the largest number of developers because they are the easiest to grasp, the most directly relevant to the coding activity, and applicable to most/all programming languages. 48 | 49 | - The most well-known complexity metric is **Cyclomatic Complexity (CC)**, invented by Thomas McCabe in 1976. CC corresponds to the **minimum number of test cases needed to achieve 100% branch coverage**. [Here](http://www.whiteboxtest.com/cyclomatic-complexity.php) is an excellent explanation on how to make use of it to measure your code quality. 50 | - An alternative, less well-known, harder to calculate complexity metric is **NPath Complexity (NC)**, invented by Brian A. Nejmeh in 1988. NC corresponds to the **minimum number of test cases needed to achieve 100% path coverage**. 51 | 52 | > [Here](http://www.literateprogramming.com/mccabe.pdf) is the original paper by McCabe, and [here](https://dl.acm.org/citation.cfm?doid=42372.42379) is the original paper by Nejmeh. 53 | 54 | These complexity metrics can be extended to class level (e.g. summing or averaging the complexity values of all methods in a class), package level, or even project level. 55 | 56 | ### Class Design Metrics 57 | 58 | Class design metrics measure how "well-designed" a class is. "Well-designed" here is defined as conformance to good software engineering principles such as high cohesion, low coupling, promoting encapsulation and information hiding. Well-designed classes promote reuse and ease maintenance effort. 59 | 60 | Metrics on this level are more applicable for QA team members and software architects, but still hold some relevance to students and junior developers who have to design a class-level API. 61 | 62 | The most well-accepted metrics for class design are [**The Chidamber and Kemerer Metrics**](http://www.virtualmachinery.com/sidebar3.htm): 63 | - Weighted Methods per Class (WMC) 64 | - Coupling Between Objects (CBO) 65 | - Response For Class (RFC) 66 | - Lack of Cohesion of Methods (LCOM) 67 | - Depth of Inheritance Tree (DIT) 68 | - Number of Children (NOC) 69 | 70 | ### Package Design Metrics 71 | 72 | Package design metrics measure how "well-designed" a package is. "Well-designed" here is similarly defined as the one in class design metrics. Metrics on this level are mostly applicable only for QA team members and software architects. 73 | 74 | The most well-accepted metrics for package design are [**"the group of five"**](http://www.virtualmachinery.com/jhawkmetricssyspack.htm): 75 | - Afferent Coupling (Ca) 76 | - Efferent Coupling (Ce) 77 | - Instability (I) 78 | - Abstractness (A) 79 | - Distance from Main Sequence (D) 80 | 81 | ### Seemingly Trivial Metrics 82 | 83 | The previous sections have introduced mostly new concepts that are foreign to many developers. 84 | However, measures that are seemingly trivial and easy-to-overlook can also count as metrics, such as the following: 85 | - Number of lines of codes in a class/method/... 86 | - Number of methods in a class 87 | - Number of fields in a class 88 | - Number of parameters in a method 89 | - Nesting depth of a method 90 | - Code coverage 91 | - Percentage of comments 92 | - Percentage of code duplication 93 | 94 | ## Define Your Own Metric 95 | 96 | You would have noticed that these metrics are self-formulated rather than being inherent properties of a piece of software, and you are right. 97 | 98 | You might then ask: can I define my own code quality metric? Yes, you can. [This page](https://www.developer.com/tech/article.php/3644656/Software-Quality-Metrics.htm) has a good guide on how to formulate your own metric. 99 | 100 | ## Making Sense of It 101 | 102 | Any code quality metric is as good as how it is used; without context, it is merely a number. **Do not** use any metric just for the sake of it. 103 | - It makes little sense to say: "This method has a CC value of 42. It is bad." 104 | - It makes more sense to say: "This method has a CC value of 42. That means we need at least 42 test cases to achieve full branch coverage for it, and it is bad." 105 | - It makes the most sense to say: "This method has a CC value of 42. That means we need at least 42 test cases to achieve full branch coverage for it. This indicates an overly complex method, and it will be difficult to maintain in the long run. Try to separate it to calls of a few methods of CC value of 10 or less each; that way we can better design test cases for those smaller methods and achieve perfect coverage." 106 | 107 | [Here](https://homepages.dcc.ufmg.br/~figueiredo/disciplinas/lectures/detection-strategy-examples_v01.pdf) is an excellent example of how different metrics are used to determine which classes/methods need some maintenance works. 108 | 109 | ## Code Quality Metrics Tools 110 | 111 | Measuring complexity (relevant to most developers): 112 | - Java: [PMD](https://pmd.github.io) 113 | - JavaScript: [ESLint](https://eslint.org) 114 | - C#: [Visual Studio Code Analysis](https://blogs.msdn.microsoft.com/zainnab/2011/05/17/code-metrics-cyclomatic-complexity/) 115 | - Python: [radon](https://pypi.python.org/pypi/radon) 116 | - Ruby: [RuboCop](https://batsov.com/rubocop/) 117 | - PHP: [PHPMD](https://phpmd.org) 118 | 119 | Measuring design (relevant to architects, QA team), most of them commercial: 120 | - Java: [JArchitect](https://www.jarchitect.com) 121 | - C#: [NDepend](https://www.ndepend.com) 122 | - PHP: [PHP Depend](https://pdepend.org) 123 | 124 |
    125 | -------------------------------------------------------------------------------- /contents/computerVision/image-classification-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/image-classification-1.png -------------------------------------------------------------------------------- /contents/computerVision/image-classification-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/image-classification-2.png -------------------------------------------------------------------------------- /contents/computerVision/image-classification-example-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/image-classification-example-1.jpg -------------------------------------------------------------------------------- /contents/computerVision/image-classification-example-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/image-classification-example-2.jpg -------------------------------------------------------------------------------- /contents/computerVision/image-transformation-example-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/image-transformation-example-1.jpg -------------------------------------------------------------------------------- /contents/computerVision/image-transformation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/image-transformation.png -------------------------------------------------------------------------------- /contents/computerVision/object-detection-example-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/object-detection-example-1.jpg -------------------------------------------------------------------------------- /contents/computerVision/object-detection-example-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/object-detection-example-2.jpg -------------------------------------------------------------------------------- /contents/computerVision/object-detection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/object-detection.png -------------------------------------------------------------------------------- /contents/computerVision/object-tracking-example-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/object-tracking-example-1.jpg -------------------------------------------------------------------------------- /contents/computerVision/object-tracking-example-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/object-tracking-example-2.jpg -------------------------------------------------------------------------------- /contents/computerVision/object-tracking-example-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/object-tracking-example-3.jpg -------------------------------------------------------------------------------- /contents/computerVision/object-tracking-example-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/object-tracking-example-4.jpg -------------------------------------------------------------------------------- /contents/computerVision/object-tracking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/se-edu/learningresources/20e849f7ad3f2d2019fd356535b07a75ac9b35a1/contents/computerVision/object-tracking.png -------------------------------------------------------------------------------- /contents/csharp/Xamarin.md: -------------------------------------------------------------------------------- 1 | 2 | title: Xamarin 3 | pageNav: 3 4 | 5 | 6 |
    7 | 8 | # Introduction to Xamarin 9 | 10 | **Author: [Ni Tianzhen](https://github.com/niqiukun)**
    11 | Reviewers: [Liu Yiwen](https://github.com/0blivious), [Tejas Bhuwania](https://github.com/Tejas2805) 12 | 13 | 14 | 15 | * [What is Xamarin‎](#what-is-xamarin) 16 | * [How Xamarin Works?](#how-xamarin-works) 17 | * [Xamarin.Android and Xamarin.iOS](#xamarin-android-and-xamarin-ios) 18 | * [Xamarin.Forms](#xamarin-forms) 19 | * [Xamarin.Essentials](#xamarin-essentials) 20 | * [Why Xamarin?‎](#why-xamarin) 21 | * [Complete Binding for Underlying SDKs](#complete-binding-for-underlying-sdks) 22 | * [Objective-C, Java, C, and C++ Interop](#objective-c-java-c-and-c-interop) 23 | * [Modern Language Constructs and Robust Base Class Library](#modern-language-constructs-and-robust-base-class-library) 24 | * [Mobile Cross-Platform Support](#mobile-cross-platform-support) 25 | * [Modern Integrated Development Environment (IDE)](#modern-integrated-development-environment-ide) 26 | * [Getting Started](#getting-started) 27 | 28 | 29 | ## What is Xamarin? 30 | 31 | **[Xamarin](https://dotnet.microsoft.com/apps/xamarin)** is an open source developer platform for building modern and performant applications on various platforms, especially Android and iOS. It is built on top of Mono, an open-source version of the .NET Framework based on the .NET ECMA standards. It is currently maintained by Microsoft and the .NET community. As one of the most established mobile app development frameworks, Xamarin offers developers the option of writing apps in C#, instead of Java and Objective-C/Swift. The architecture of Xamarin aims to achieve maximum code reuse across different platforms while maintaining near-native performance. 32 | 33 | ## How Xamarin Works? 34 | 35 | Here is an overview of the architecture of a cross-platform Xamarin application. 36 | 37 | ![Architecture of Xamarin](xamarin-forms-architecture.png) 38 | *Figure 1. Overview of the architecture of a cross-platform Xamarin Application* 39 | 40 | Xamarin allows developers to create native UI on each platform and write business logic in C# that is shared across platforms. In most cases, 80% of application code is sharable using Xamarin. A typical cross-platform Xamarin project consists of three sub-projects: **Shared Code, Xamarin.Android, and Xamarin.iOS**. 41 | 42 | While Shared Code consists of common business logic, cross-platform UI elements (**Xamarin.Forms**) and a collection of native device features (**Xamarin.Essentials**), **Xamarin.Android** and **Xamarin.iOS** provide access to remaining native features and handle the compilation of shared code into native assemblies. 43 | 44 | ### Xamarin.Android and Xamarin.iOS 45 | 46 | Xamarin.Android and Xamarin.iOS handle the compilation of both shared code and platform dependent code into native assemblies. The difference between the two is that while Xamarin.Android compiles C# into Intermediate Language, which is then **Just-in-Time (JIT)** compiled to a native assembly within the Mono execution environment, Xamarin.iOS compiles C# into assembly code fully **Ahead-of-Time (AOT)**. 47 | 48 | Within the sub-projects, developers can access the complete Android or iOS SDK, wrapped with .NET APIs. This allows the entire application to be developed in C#, without writing any native code. Moreover, developers can leverage on the latest platform-specific features. For example, the `ARKit` Namespace, included in Xamarin iOS SDK, gives developers full access to ARKit of iOS SDK in C#. 49 | 50 | Developers can also use native UI components and libraries wrapped with .NET APIs, such as Material Theme for Android and Storyboards for iOS. Alternatively, they can use Xamarin.Forms, which allows UI code to be shared across platforms. 51 | 52 | ### Xamarin.Forms 53 | 54 | Xamarin.Forms provides a consistent API for creating UI elements across platforms. This API can be implemented in either XAML or C# and supports data-binding for patterns such as Model-View-ViewModel (MVVM). 55 | 56 | At runtime, Xamarin.Forms utilizes platform renderers to convert the cross-platform UI elements into native controls on Android and iOS. This allows developers to get the native look, feel and performance while realizing the benefits of code sharing across platforms. 57 | 58 | Similar to HTML and JavaScript, Xamarin.Forms separates view and logic with XAML and C#. The following code example demonstrates a sample page in Xamarin.Forms. 59 | 60 | In `MainPage.xaml`: 61 | ```xml 62 | 63 | 64 |