We follow generally accepted good practices when it comes to programming, especially those practices that make sense to our project. Some practices are related to C# and others are more general to OOP principles (like SOLID, DRY...).
Even though it's unusual for blockchain projects, we follow a domain driven design (DDD) approach to our developpement style. Part of the reason for this is that one of our main frameworks follows this approach and since the framework is a good fit for our needs, it's natural that we take the same design philosophy.
A few key points concerning DDD:
traditionally, four layers: presentation, application, domain and infrastructure.
presentation for us corresponds to any type of dApp.
application represents exposed services mapped to the different domains.
domain represents the specific events related to our blockchain system and also domain objects.
finaly infra are the third party libraries we use for database, networking...
The main programming language used to code and build AElf is C# and is built with the dotnet core framework. It’s a choice that was made due to the excellent performances observed with the framework. Dotnet core also comes with the benefit of being cross platform, at least for the three main ones that are Windows, MacOS and Linux. Dotnet core also is a dynamic and open source framework and comes with many advantages of current modern development patterns and is backed by big actors in the IT space.
At a higher level we use an application framework named ABP (https://abp.io/documents/abp/latest/Index). From a functional point of view, a blockchain node is a set of endpoints, like RPC, P2P and cross-chain and some higher level protocol on top of this. So ABP is a natural fit for this, because it offers a framework for building these types of applications.
We use the Xunit framework for our unit tests. We also have some custom made frameworks for testing smart contracts.
For lower level, we use gRPC for the cross-chain and p2p network communication. Besides for gRPC, we also use Protobuf for serialization purposes.