Gradle Interview Questions and Answers

Gradle Interview Questions and Answers

Last updated on 13th Oct 2020, Blog, Interview Question

About author

Madhusudhan (Lead Engineer - Director Level )

He is Highly Experienced in Respective Technical Domain with 6+ Years, Also He is a Respective Technical Trainer for Past 5 Years & Share's This Important Articles For us.

(5.0) | 16797 Ratings 2208

Searching for a Gradle job? If you are an expert in writing scripts then this is for you. Do not worry, we’ve a right answer for your job interview preparation. If you are preparing for Gradle job interview, we will help you in clearing the interview through ACTE interview questions and answers page. It is an automation system and freeware which can be downloaded for free from internet. It takes the basis from Maven and Ant. Using Java, you can code in your own way. It is used in Android Studio. It is different to XML language. It is a plugin based system that can be attached to your browser. Below are the Gradle interview questions and answers which makes you comfortable to face the interviews:

1. What Is a Gradle Framework?


Gradle is an open-source build automation system that builds based on the concepts of Apache Ant and Apache Maven and introduces a Groovy-based domain-specific language (DSL) instead of the XML form used by Apache Maven for declaring the project configuration.

2. Advantages Of Using Gradle?


Gradle combines both Ant and Maven, taking the best from both of these frameworks; Flexibility from Ant tool and convention over configuration, dependency management and plugins from Maven.

Gradle provides support for multi-project builds.

3. What Is a Gradle Wrapper?


A wrapper is a batch script and it is one of the ways to perform Gradle build. When executed the first time, it automatically downloads Gradle and then initiates the build.

It helps to set up Gradle workspace quickly for first-time users (Zero installation) and also ensures all the developers use the same version of Gradle.

4. Why Gradle Is Preferred Over Other Build Tools?


Gradle build script is written using a groovy API which has the syntax similar to Java so it is easy to understand.

Gradle supports ant tasks, ivy and Maven repositories for dependency management. It also has a maven Pom.xml converter to Gradle build script.

  • It is open source.
  • provides strong support for multi-project builds.
  • supports build cache.

5. What Is The Gradle Build Script File Name?



6. What Is The Latest Version Of Gradle Available In The Market?


Gradle build tool latest version is 3.5 as of May 2017 with faster functions. The version on your local Gradle installation can be checked using the folowing command,

  • Gradle -v

7. How Do You Run Gradle Build?


Execute Gradle build using Gradle command.

8. What Are The Core Components Of Gradle Build Script?


Project and task are the core components. Groovy organizes projects as a list of tasks.

To view the list of available projects, use the command Gradle projects, for the tasks list the command is Gradle tasks.

9. How Do You Find Gradle Project Dependencies?


Use the Gradle command Gradle dependencies that list the dependencies of the selected project. It includes both direct and transitive dependencies.

10. The Main Difference Between Maven Build.xml And Build.gradle Script?


Maven build.xml is an xml document that includes start and end tags. Build.gradle is a Groovy script which has a syntax similar to Java.

Subscribe For Free Demo

Error: Contact form not found.

11. How Do I Check Out And Build The Framework?


Framework uses a Gradle-based build system. In the instructions below, ./gradlew is invoked from the root of the source tree and serves as a cross-platform, self-contained bootstrap mechanism for the build.

Prerequisites – Git and JDK 8 update 20 or later

Be sure that your JAVA_HOME environment variable points to the jdk1.8.0 folder extracted from the JDK download.

Run ./ or read as appropriate.

Note: Per the prerequisites above, ensure that you have JDK 8 configured properly in your IDE.

Install all spring-* jars into your local Maven cache

  • ./gradlew install

Compile and test; build all jars, distribution zips, and docs

  • ./gradlew build

… and discover more commands with ./gradle tasks. See also the Gradle build and release FAQ.

Contributing – Pull requests are welcome; see the contributor guidelines for details.

Staying in Touch – Follow @SpringCentral as well as @SpringFramework and its team members on Twitter. In-depth articles can be found at The Spring Blog, and releases are announced via our news feed.

License – The Spring Framework is released under version 2.0 of the Apache License

12. How Long Should A Build Take? When Running `./gradle Build` For The First Time, It Is Likely That The Gradle Wrapper Script Will Need To Download Gradle For You. Gradle Distributions Run Around 30mb, So This Step Will Be Connection-speed Dependent?


You will also need to download all of Spring’s compile- and test-time dependencies. This currently runs around 120MB. Keep in mind here that almost all of these dependencies are optional at runtime for applications that use Spring. It’s only when building from source that you actually need them all!

Once you’ve bootstrapped a Gradle distribution and downloaded dependencies, you won’t need to do it again; they are cached in your $HOME/.gradle directory. A complete ./gradle clean build at this point will take between 5 and 15 minutes depending on your clock and disk speed. A solid-state drive makes a huge difference here!

As is also mentioned below in the ‘tips’ section, you’ll want to break yourself of any habits executing the clean task during normal development iterations. Gradle has excellent incremental build support, meaning that once you’ve built Javadoc, compiled, run tests, etc, Gradle won’t execute these tasks again unless the inputs for those tasks (e.g. .java files) have changed. As a general rule, just run ./gradle build or ./gradle test (without clean) to keep things snappy.

Also, consider running with the -a flag to avoid evaluating other subprojects you depend on. For example, if you’re iterating on changes in spring-web MVC, cd into the spring-web MVC directory and run ../gradlew -a build to tell Gradle to evaluate and build only that subproject.

13. How Do I Configure The Gradle Daemon To Speed Up Builds?


The Gradle daemon helps greatly in eliminating startup overhead. This feature may potentially be enabled by default in the future, but in the meantime, you need to instruct Gradle to launch the daemon process. This can be achieved by passing the –daemon flag to Gradle at the command line, by exporting a GRADLE_OPTS environment variable that includes -Dorg.gradle.daemon=true, or by adding org.gradle.daemon=true to the file in your Gradle user home directory.

If you are building against JDK 9 and using the Gradle daemon, you may encounter an Unrecognized VM option error which halts the build. To avoid this error, you can add org.gradle.jvmargs=-XX:MaxMetaspaceSize=1024m -Xmx1024m to the file in your Gradle user home directory. See also GRADLE-3256 for details.

14. Why Are Compile-time Warnings Suppressed? You’ll Notice That ‘build.gradle’ Includes The Following Line?


This tells Gradle to suppress all warnings during compilation. The reason for this is that the framework currently has many warnings, most of which are related to generics usage — particularly raw type warnings — e.g. using Class instead of Class<?> This is an artifact switching to Java 5 in Spring 3. As with the Javadoc warnings mentioned above, committers are encouraged to fix these warnings whenever possible. Once the bulk of them are eliminated, we can switch to -Xlint: all. In the meantime, it just creates unnecessary noise in the build output.

15. What About Publishing Artifacts To Maven Central?


This allows for maximum convenience for the majority of Spring users, given that most users have Maven-based builds and Maven resolves artifacts by default from Maven Central.

The preferred way of releasing artifacts to Maven Central is via Sonatype’s Nexus server at (OSO). This is explained in detail in Sonatype’s OSS usage guide.

The Spring Artifactory repository has been customized with a “nexus-push” plugin that allows for automatic propagation of builds from Artifactory to the Nexus server at OSO for publication into Maven Central.

All Spring projects — that is, all projects having groupid org.spring framework — can publish to OSO under the shared ‘SpringSource’ account. This has already been set up in the nexus-push plugin, so there’s no additional setup necessary at OSO, even for new projects.

The Artifactory Bamboo plugin supports the use of the nexus-push plugin through it’s UI. Step 3 of the FAQ entry above on publishing releases described the process for promoting a build-out of staging. If the build is a GA release, simply choose the ‘Push to Nexus’ option, and select ‘libs-release-local’ as the target repository.

16. What’s The Overall Roadmap?


A subsequent milestone release of Gradle Script Kotlin will ship with the forthcoming Gradle 3.0. We’ll be posting further information about the roadmap to Gradle Script Kotlin 1.0 GA soon.

17. Is Using Groovy For My Build Scripts Deprecated?


No. Gradle’s Groovy support is not deprecated and will continue to be supported.

18. Will Existing Plugins Still Work When I Write My Build Logic In Kotlin?


Yes, they will continue to work without a problem. Gradle plugins can be developed in any JVM language and they interoperate well with each other as well as with build scripts written in Kotlin or Groovy.

19. Do I Have To Use An Intellij Idea When Using Kotlin For Gradle?


No. Although JetBrains is the company behind IDEA and also the inventor and driving force behind Kotlin, JetBrains is also committed to providing Kotlin support for Eclipse. The IDE support for writing Gradle build logic in Eclipse will actually improve with Kotlin once we integrate the Eclipse Kotlin support into Buildship, the Gradle plugin for Eclipse.

20. In What Language Should I Develop My Plugins?


You can develop your plugins in any JVM language, but as part of this effort, we are working on making Kotlin the language of choice for developing Gradle plugins. Stay tuned!

21. How do I force Gradle to download dependencies always?


You may refresh dependencies in your cache using the command line option –refresh-dependencies. Also deleting the cached files under ~/.gradle/caches would get the next Gradle to build to download them again.

22. What are Gradle projects and tasks?


Every Gradle build is made up of one or more projects. What a project represents depends on what it is that you are doing with Gradle. For example, a project might represent a library JAR or a web application. It might represent a distribution ZIP assembled from the JARs produced by other projects. A project does not necessarily represent a thing to be built. It might represent a thing to be done, such as deploying your application to staging or production environments. Don’t worry if this seems a little vague for now. Gradle’s build-by-convention support adds a more concrete definition of what a project is.

Each project is made up of one or more tasks. A task represents some atomic piece of work which a build performs. This might be compiling some classes, creating a JAR, generating Javadoc, or publishing some archives to a repository.

23. What is Gradle Daemon?


The Daemon is a long-lived process that helps with the faster build process, by avoiding the cost of JVM startup for every build and also caches information about project structure, files, tasks, and more in memory.

  1. 1. A daemon is a computer program that runs as a background process, rather than being under the direct control of an interactive user.
  2. 2. Gradle runs on the Java Virtual Machine (JVM) and uses several supporting libraries that require a non-trivial initialization time.
  3. 3. As a result, it can sometimes seem a little slow to start. The solution to this problem is the Gradle Daemon: a long-lived background process that executes your builds much more quickly than would otherwise be the case.
  4. 4. We accomplish this by avoiding the expensive bootstrapping process as well as leveraging caching, by keeping data about your project in memory.

24. How Gradle achieves faster performance?


Gradle improves build speed by reusing computations from previous builds and also uses cache information.

25. Difference between settings.Gradle & Gradle .properties?


The settings.gradle is a Groovy script that defines build related settings and not project related. It is evaluated against a Settings object and with this Settings object, you can add subprojects to your build, modify the parameter from the command line (StartParameter) and access the Gradle object to register lifecycle handlers.

The file is a simple Java properties file. It’s a simple key-value store that only allows string values.

Course Curriculum

Get Practical Oriented Gradle Training to UPGRADE Your Skill Set

  • Instructor-led Sessions
  • Real-life Case Studies
  • Assignments
Explore Curriculum

26. What is Gradle Dependency Management?


Gradle Dependency Management involves the programming of dependencies that operate in the form to build projects and Gradle work in a particular path which leads to a unique syntax that is termed as dependencies. Perhaps, Gradle’s main function is to look for the path where it can run or construct the project in order to find them. The Gradle determines the dependencies of any project and lets them highlight in the build tool.

27. What is Gradle Multi-Project Build?


Gradle is said to be one of the best tools which can handle any tasks irrespective of large or small. This unique tool is highly efficient enough to work with any kind of task-related projects. The smaller the file is, the work becomes easier and flexible and this entire process is called as Gradle Multi-Project Build.

  • Multi-project builds help with modularization. It allows a person to concentrate on one area of work in a larger project, while Gradle takes care of dependencies from other parts of the project
  • A multi-project build in Gradle consists of one root project, and one or more subprojects that may also have subprojects.
  • While each subproject could configure itself in complete isolation of the other subprojects, it is common that subprojects share common traits.
  • It is then usually preferable to share configurations among projects, so the same configuration affects several subprojects.

28. What is Gradle Motto?


The Gradle tool has chosen an idealistic slogan which makes the user believe in a composite framework and the quote says “Make the impossible possible, make the possible easy, and make the easy elegant”.

29. What is the Gradle Build Environment?


The Gradle serves various ways and options that help to build and construct Java to configure it throughout the process of the entire project which will carry out the build.

30. Why Gradle Is Preferred Over Maven or Ant?


There isn’t a great support for multi-project builds in Ant and Maven. Developers end up doing a lot of coding to support multi-project builds.

Also having some build-by-convention is nice and makes build scripts more concise. With Maven, it takes build by convention too far, and customizing your build process becomes a hack.

Maven also promotes every project publishing an artifact. Maven does not support subprojects to be built and versioned together. But with Gradle developers can have the flexibility of Ant and build by convention of Maven.

Groovy is easier and clean to code than XML. In Gradle, developers can define dependencies between projects on the local file system without the need to publish artifacts to the repository.

31. What is the difference between Gradle and Maven?


The following is a summary of the major differences between Gradle and Apache Maven:

Flexibility : Google chose Gradle as the official build tool for Android; not because build scripts are code, but because Gradle is modeled in a way that is extensible in the most fundamental ways.

Both Gradle and Maven provide convention over configuration. However, Maven provides a very rigid model that makes customization tedious and sometimes impossible.

While this can make it easier to understand any given Maven build, it also makes it unsuitable for many automation problems. Gradle, on the other hand, is built with an empowered and responsible user in mind.

Performance : Both Gradle and Maven employ some form of parallel project building and parallel dependency resolution. The biggest differences are Gradle’s mechanisms for work avoidance and incrementally.

Following features make Gradle much faster than Maven:

Incrementally : Gradle avoids work by tracking input and output of tasks and only running what is necessary.

Build Cache : Reuses the build outputs of any other Gradle build with the same inputs.

Gradle Daemon : A long-lived process that keeps information “hot” in memory.

User Experience : Maven has very good support for various IDE’s. Gradle’s IDE support continues to improve quickly but is not great as of Maven.

Although IDEs are important, a large number of users prefer to execute build operations through a command-line interface. Gradle provides a modern CLI that has discoverability features like `gradle tasks`, as well as improved logging and command-line completion.

Dependency Management : Both build systems provide built-in capability to resolve dependencies from configurable repositories. Both are able to cache dependencies locally and download them in parallel.

As a library consumer, Maven allows one to override a dependency, but only by version.

Gradle provides customizable dependency selection and substitution rules that can be declared once and handle unwanted dependencies project-wide. This substitution mechanism enables Gradle to build multiple source projects together to create composite builds.

Maven has few, built-in dependency scopes, which forces awkward module architectures in common scenarios like using test fixtures or code generation. There is no separation between unit and integration tests, for example. Gradle allows custom dependency scopes, which provides better-modeled and faster builds.

32. How To Add Dependencies In Gradle?


In order to make sure that dependency for your project is added, you need to mention the configuration dependency like compiling the block dependencies of the build.gradle file.

33. What Is Dependency Configuration?


Dependency configuration comprises of the external dependency, which you need to install well and make sure the downloading is done from the web. There are some key features of this configuration which are:

1. Compilation: The project which you would be starting and working on the first needs to be well compiled and ensure that it is maintained in good condition.

2. Runtime: It is the desired time which is required to get the work dependency in the form of collection.

3. Test Compile: The dependencies check source requires the collection to be made for running the project.

4. Test runtime: This is the final process which needs the checking to be done for running the test that is in a default manner considered to be the mode of runtime.

Create a Gradle task and explain how to execute it.

The Gradle build file defines the project and its tasks. The below list a simple task to print “Hello world!”.

  • task hello {
  •     doLast {
  •         println ‘Hello World!’
  •     }
  • }

Run Gradle hello on the command line in the directory of the build file to execute hello task. If the Gradle output should be suppressed, use the -q (quiet) parameter.

  • gradle hello

34. What Is Dependency Management in Gradle?


Software projects rarely work in isolation. In most cases, a project relies on reusable functionality in the form of libraries or is broken up into individual components to compose a modularized system.

Dependency management is a technique for declaring, resolving and using dependencies required by the project in an automated fashion.

Gradle has built-in support for dependency management and lives up the task of fulfilling typical scenarios encountered in modern software projects.

35. What Are Benefits Of Daemon in Gradle 3.0?


Here are some of the benefits of Gradle daemon

  1. 1. It has good UX
  2. 2. It is very powerful
  3. 3. It is aware of the resource
  4. 4. It is well integrated with the Gradle Build scans
  5. 5. It has been default enabled

36. What is the difference between settings.gradle and ?


settings.gradle is a Groovy script that defines build related settings and not project related settings while in case of, file is a simple Java Properties file. It is a simple key-value store.

37. What Is a Gradle Build Task?


Gradle Build Tasks is made up of one or more projects and a project represents what is been done with Gradle.

Some key of features of Gradle Build Tasks are:

  1. 1. Task has lifecycle methods [do first, do last]
  2. 2. Build Scripts are code
  3. 3. Default tasks like run, clean etc
  4. 4. Task dependencies can be defined using properties like dependsOn

38. What is the Gradle Build Life Cycle?


Gradle Build life cycle consists of following three steps

  • Initialization phase : In this phase the project layer or objects are organized
  • Configuration phase : In this phase all the tasks are available for the current build and a dependency graph is created
  • Execution phase : In this phase tasks are executed.

39. What is Gradle Java Plugin?


The Java plugin adds Java compilation along with testing and bundling capabilities to the project. It is introduced in the way of a SourceSet which act as a group of source files compiled and executed together.

40. List the gradle build configuration files.


  1. 1. build.gradle, script that defines the build configuration,
  2. 2.
  3. 3. settings.gradle
Gradle Sample Resumes! Download & Edit, Get Noticed by Top Employers! Download

41. How do I add gradle dependencies?


To add a dependency to your project, specify a dependency configuration such as compile under the dependencies block of your build.gradle file.

  • dependencies {
  •    compile group: ‘org.hibernate’, name: ‘hibernate-core’, version: ‘3.6.7.Final’
  •    testCompile group: ‘junit’, name: ‘junit’, version: ‘4.+’
  • }

42. What is the Gradle command to view the list of available projects?


Use gradle projects command.

43. What are the types of plugin in Gradle?


There are 2 general types of plugins in Gradle, script plugins and binary plugins.

  • Script plugins – are additional build scripts that further configure the build and usually implement a declarative approach to manipulating the build.
  • Binary plugins – are classes that implement the Plugin interface and adopt a programmatic approach to manipulating the build.

44. In which programming language should one develop plugins for Gradle?


One can develop plugins for Gradle in any JVM language such as Java, Scala etc.

45. Explain spring boot gradle plugin.


The Spring Boot Gradle Plugin provides Spring Boot support in Gradle, allowing you to package executable jar or war, execute Spring Boot applications, and use the dependency management provided by spring-boot-dependencies.

46. What is a Gradle build language?


Gradle provides a domain specific language (DSL) for describing builds. This build language is available in Groovy and Kotlin.

47. Default file name of the Groovy build script?


It is build.gradle. Kotlin DSL script files use the .gradle.kts file name extension.

48. What are all projects and subprojects sections in the Gradle build file?


A multi-project gradle build will have rootProject and the subprojects, both together, are considered as allprojects. The build starts from rootProject however it usually has no code, subproject does. allproject section can have dependencies seen by all projects while subproject dependencies seen only by those sub projects.

Usually subprojects only apply to the Java plugin as it has code.

  • subprojects {
  •     apply plugin: ‘java’

49. How do I find the Gradle version?


Open a console (or a Windows command prompt) and run gradle -v to run gradle and display the version as shown in the below picture.


50. What are the features of the Spring Boot Gradle Plugin?


The Spring Boot Gradle Plugin provides Spring Boot support in Gradle. It collects all the jars on the classpath and builds a single, runnable jar, which makes it more convenient to execute and transport your service.

  • plugins {
  • id ‘org.springframework.boot’ version ‘2.2.1.RELEASE’
  • }

Difference between declaring repositories in the buildScript section of the Gradle build or in the root level of the build.

  • buildScript {
  •     repositories {
  •         mavenCentral()
  •     }
  • }

The repositories in the buildScript block are used to fetch the dependencies of your buildScript dependencies. For example, your plugin dependencies are listed here.

  • repositories {
  •     mavenCentral()
  • }

The repositories on the root level are used to fetch the dependencies that your project depends on. So all the dependencies you need to compile your project.

51. Difference between api and implementation in Gradle.


The api configuration should be used to declare dependencies which are exported by the library API, whereas the implementation configuration should be used to declare dependencies which are internal to the component.

  • dependencies {
  •     api ‘org.apache.httpcomponents:httpclient:4.5.7’
  •     implementation ‘org.apache.commons:commons-lang3:3.5’
  • }

Dependencies appearing in the “api” configurations will be transitively exposed to consumers of the library, and as such will appear on the compile classpath of consumers. Dependencies found in the “implementation” configuration will, on the other hand, not be exposed to consumers, and therefore not leak into the consumers’ compile classpath.

52. How to Install Gradle on Eclipse?


Step 1: Open Eclipse

Step 2: Click on Help menu on the toolbar & install new software

Step 3: Click add

Step 4: Insert name with anything

Step 5: Click OK and check all the checkbox

Step 6: Click on finish button

53. List system requirements to install and run Gradle?


System requirements to install and run Gradle

  1. 1. JDK version 6 or above
  2. 2. JDK libraries must set in JAVA_HOME

Here you just need to follow certain steps to install Gradle.

Firstly you need to download the ZIP file and then unzip it into the directory. Now the distribution ZIP file also consists of two types: Binary or complete or all.

The distribution file in the directory requires to be in the terminal path to configure the settings and finally install the Gradle.

54. What will be the output of the below Gradle code snippet?


  • task count &lt;&lt; {
  •    4.times { 
  •       print “$it ” 
  •    }
  • }

The output of the given Gradle program is..

0 1 2 3

55. In Gradle how to access appropriate getter and setter methods of a particular property by specifying its reference?


The following Gradle snippet defines the syntaxes of getter and setter methods of a property buildDir.

  • // Using a getter method
  • println project.buildDir
  • println getProject().getBuildDir()
  • // Using a setter method
  • project.buildDir = ‘new target’
  • getProject().setBuildDir(‘new target’)

56. In Gradle can we call methods like below : test.systemProperty ‘a.prop’, ‘value’


Yes, this is a valid method calling in Gradle. Groovy contains a special feature in methods calling that is the parentheses are optional for method calling.

57. What is Closure is Gradle?


Gradle DSL uses closures in many places. Where the last parameter of a method is a closure, closure can be placed after the method call.


  • repositories(
  •  {
  •    println “in a closure”
  •  }
  • )

58. In Gradle how to add dependencies to the task?


Here is an example which adds a dependency from taskX to taskY:

  • task taskX &lt;&lt; {
  •    println ‘taskX’
  • }
  • task taskY(dependsOn: ‘taskX’) &lt;&lt; {
  •    println “taskY”
  • }

59. What is a task collection in Gradle?


Collection of task names is referred by its tasks collection.

60. How to set the dependencies in Gradle?


Dependency configuration is nothing but a defined set of dependencies. This feature can be used to declare external dependencies which need to download from the web. Here is the code snippet:

  • apply plugin: ‘java’
  • repositories {
  •    mavenCentral()
  • }
  • dependencies {
  •    compile group: ‘org.hibernate’, name: ‘hibernate-core’, version: ‘3.6.7.Final’
  •    testCompile group: ‘junit’, name: ‘junit’, version: ‘4.+’
  • }

61. What are the standard dependency configurations in Gradle?


Following are the standard dependency configurations in Gradle:

  1. 1. Compile – These are the dependencies required to compile the production source of the project.
  2. 2. Runtime – These are the dependencies required by the production classes at runtime. By default, it includes the compile time dependencies.
  3. 3. Test Compile – These are the dependencies required to compile the test source of the project. By default, it includes compiled production classes and compile time dependencies.
  4. 4. Test Runtime – These are the dependencies required to run the tests. By default, it includes runtime and test compile dependencies.

62. What are the external dependencies in Gradle?


It is a dependency on some files built outside on the current build, and stored in a repository of some kind, such as Maven central or a file on the local file system.

63. How to define the external dependency in Gradle?


Here is the code to define to be written in build.gradle file to define the external dependency in Gradle:

  • dependencies {
  •    compile group: ‘org.hibernate’, name: ‘hibernate-core’, version: ‘3.6.7.Final’
  • }

64. What are Repositories in Gradle?


Repository is nothing but a collection of files, organized by group, name and version. By default, Gradle does not define any repositories.

65. How to define the repository in Gradle?


Below is the code to define the repository in Gradle. This code should be added in the build.gradle file.

  • repositories {
  •    maven()
  •   }
  • }

Are you looking training with Right Jobs?

Contact Us

Popular Courses