To solve the optimization problem described, we first need to convert the natural language description into a symbolic representation. Let's denote:

- $x_1$ as the number of student version software packages produced,
- $x_2$ as the number of professional version software packages produced.

The objective is to maximize profits. The profit per student version is $400, and the profit per professional version is $1500. Therefore, the objective function can be represented algebraically as:

\[ \text{Maximize:} \quad 400x_1 + 1500x_2 \]

Given the constraints:
1. The total number of licenses sold for both versions combined cannot exceed 350 per month.
2. The production cost for a student version is $750, and for a professional version is $3000.
3. Banana does not want to spend more than $500,000.

These constraints can be represented algebraically as:
1. $x_1 + x_2 \leq 350$ (combined licenses constraint)
2. $750x_1 + 3000x_2 \leq 500,000$ (budget constraint)

Additionally, since we cannot produce a negative number of software packages, we have non-negativity constraints:
3. $x_1 \geq 0$
4. $x_2 \geq 0$

Symbolically representing the problem:

```json
{
    'sym_variables': [('x1', 'number of student version software packages'), ('x2', 'number of professional version software packages')],
    'objective_function': '400*x1 + 1500*x2',
    'constraints': ['x1 + x2 <= 350', '750*x1 + 3000*x2 <= 500000', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's write the Gurobi code in Python to solve this linear programming problem:

```python
from gurobipy import *

# Create a new model
m = Model("Banana_Software")

# Add variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="student_version", lb=0)
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="professional_version", lb=0)

# Set the objective function
m.setObjective(400*x1 + 1500*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 + x2 <= 350, "combined_licenses")
m.addConstr(750*x1 + 3000*x2 <= 500000, "budget")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Student version: {x1.x}")
    print(f"Professional version: {x2.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```